Das Hinzufügen einer nicht nullfähigen Spalte zu einer vorhandenen Tabelle schlägt fehl. Wird das Attribut "value" ignoriert?

8

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

    
David 18.01.2012, 02:12
quelle

2 Antworten

16

Kurze Antwort

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.

Problemumgehung

Die in der Frage beschriebene Problemumgehung ist der Weg zu gehen. Das resultierende SQL wird sein:

  1. Fügen Sie die Spalte

    hinzu %Vor%
  2. Stellen Sie für jede Zeile einen Wert ungleich null ein

    %Vor%
  3. Fügen Sie die NOT NULL-Einschränkung

    hinzu %Vor%

Warum?

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:

%Vor%

... das ist nicht möglich , wenn die Tabelle bereits Zeilen enthält. Es ist einfach nicht schlau genug.

Alternative Lösung

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:

%Vor%

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).

    
Erwin Brandstetter 18.01.2012, 07:21
quelle
1

Verwenden Sie "defaultValue" anstelle von "value", um einen Standardwert für die neue Spalte festzulegen.

    
Nogge 19.12.2013 14:08
quelle