Hintergrund: Wir haben eine Grails 1.3.7 App und verwenden Liquibase, um unsere Datenbankmigrationen zu verwalten.
Ich versuche, eine neue Spalte zu einer vorhandenen Tabelle hinzuzufügen, die nicht leer ist.
Mein Änderungssatz sieht folgendermaßen aus:
%Vor%Dies sollte den Wert 'Kein Text' in jede vorhandene Zeile eingefügt haben und daher die Nicht-Null-Einschränkung erfüllen. Liquibase "Add Column" -Dokumente .
Aber wenn die Migrationsänderungssätze angewendet werden, bekomme ich die folgende Ausnahme:
%Vor%Das sieht für mich so aus, als würde es das Attribut 'value' nicht benutzen.
Wenn ich meinen Änderungssatz so ändere, dass er wie folgt aussieht, kann ich dasselbe erreichen. Aber ich will (und sollte) das nicht tun.
%Vor% Akzeptiert Liquibase wirklich mein Attribut value
oder gibt es hier etwas anderes, das ich nicht sehen kann?
Ich benutze Grails 1.3.7, Datenbank-Migration plugin 1.0, Postgres 9.0
Das Attribut "value" funktioniert nicht, wenn Sie zum Zeitpunkt der Spaltenerstellung eine Nicht-Null-Einschränkung hinzufügen (dies wird in Dokumentation ). Das generierte SQL kann nicht ausgeführt werden.
Die in der Frage beschriebene Problemumgehung ist der Weg zu gehen. Das resultierende SQL wird sein:
Fügen Sie die Spalte
hinzu %Vor%Stellen Sie für jede Zeile einen Wert ungleich null ein
%Vor%Fügen Sie die NOT NULL-Einschränkung
hinzu %Vor% Ein Spaltenstandard wird nur in die Spalte mit INSERT
eingefügt. Das Tag "value" macht das für Sie, aber nachdem die Spalte hinzugefügt wurde. Liquibase versucht, die Spalte in einem Schritt mit der NOT NULL-Einschränkung hinzuzufügen:
... das ist nicht möglich , wenn die Tabelle bereits Zeilen enthält. Es ist einfach nicht schlau genug.
Seit PostgreSQL 8.0 (so fast schon für immer) wäre es eine Alternative, die neue Spalte mit einer Nicht-Null-Klausel DEFAULT
hinzuzufügen:
Ich zitiere das Handbuch zu ALTER TABLE
:
Wenn eine Spalte mit ADD COLUMN hinzugefügt wird, werden alle vorhandenen Zeilen in der Tabelle angezeigt werden mit dem Standardwert der Spalte initialisiert (NULL, wenn kein DEFAULT Klausel ist angegeben).
Tags und Links sql grails postgresql database-design liquibase