Alter column set not null ausfällt
Betrachten wir die folgende Tabelle mit etwa 10M Zeilen
CREATE TABLE user
(
id bigint NOT NULL,
...
CONSTRAINT user_pk PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
)
Dann habe ich das folgende alter
ALTER TABLE USER ADD COLUMN BUSINESS_ID VARCHAR2(50);
--OK
UPDATE USER SET BUSINESS_ID = ID; //~1500 sec
--OK
ALTER TABLE USER ALTER COLUMN BUSINESS_ID SET NOT NULL;
ERROR: column "business_id" contains null values
SQL state: 23502
Dies ist sehr seltsam, da die Spalte id (die kopiert wurde, um business_id Spalte) kann nicht null-Werte enthalten, da es der Primärschlüssel, aber um sicher zu sein ich check es
select count(*) from USER where BUSINESS_ID is null
--0 records
Ich vermute, dass das ein bug ist, einfach Fragen, wenn mir etwas fehlt trivial
Ich hab keine Ahnung, warum das passieren würde. Vielleicht versuchen Sie das UPDATE mit einem expliziten cast:
Es gibt eine chance, Sie ist mit der Tatsache, dass der "Benutzer" ist ein reserviertes Wort, aber ich weiß es nicht wirklich. Reservierte Wörter-Liste: postgresql.org/docs/current/static/sql-keywords-appendix.html
Es gibt keine Art
Benutzer ist nicht der tatsächliche name der Tabelle, die ich gerade es vereinfacht zu schreiben, die Frage
Brandstetter Datenbank EnterpriseDB mit oracle-Kompatibilität aktiviert
UPDATE "user" set business_id = ID::VARCHAR
Es gibt eine chance, Sie ist mit der Tatsache, dass der "Benutzer" ist ein reserviertes Wort, aber ich weiß es nicht wirklich. Reservierte Wörter-Liste: postgresql.org/docs/current/static/sql-keywords-appendix.html
Es gibt keine Art
VARCHAR2
in Postgres. Etwas aus in Ihrem queston ..Benutzer ist nicht der tatsächliche name der Tabelle, die ich gerade es vereinfacht zu schreiben, die Frage
Brandstetter Datenbank EnterpriseDB mit oracle-Kompatibilität aktiviert
InformationsquelleAutor dimcookies | 2013-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige logische Erklärung wäre eine gleichzeitige
INSERT
..(Mit
tbl
anstelle des reservierten Wortesuser
als Tabelle Namen).Um dies zu verhindern, verwenden Sie stattdessen:
Dann können Sie am Ende mit einem Standard-Wert in einigen Zeilen. Möchten Sie vielleicht zu prüfen.
Oder führen Sie alles, was als Transaktion blockieren und eine exklusive Sperre, um sicher zu sein:
BUSINESS_ID is null
Leider kann ich nicht mit einem Standard-Wert, da sollte es eine eindeutige Spalte (die eine eindeutigkeits-integritätsregel Hinzugefügt wird, nach dieser Aussage). Ich habe versucht, die Transaktion zu blockieren, aber das scheint nicht, etwas zu ändern. Es scheint ein Fehler zu sein, wir werden uns mit den EnterpriseDb-support, ich wollte nur sehen, ob es etwas offensichtlich, dass ich fehlte. In jedem Fall, ich danke Ihnen für Ihre Zeit
postgresql.org/docs/7.3/static/ddl-alter.html Referenz für die
alter table
Ja, aber 7.3 ist uralt. Blick auf die man-pages für Ihre Postgres-version: postgresql.org/docs/current/static/ddl-alter.html
InformationsquelleAutor Erwin Brandstetter
Vielleicht will es einen default-Wert? Postgresql docs auf ALTER:
So,
SET DEFAULT 0
in dem Fall eine ganze Zahl.InformationsquelleAutor Ondra Žižka
Können Sie nicht tun, dass auf der gleichen Transaktion. Fügen Sie Ihre Spalte, und aktualisieren Sie es. Dann in einer separaten Transaktion die not null-Einschränkung.
InformationsquelleAutor K.z