PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Das Hinzufügen einer Nicht-Nullable-Spalte zu einer vorhandenen Tabelle schlägt fehl. Wird das value-Attribut ignoriert?

Kurze Antwort

Das Attribut "value" funktioniert nicht, wenn Sie zum Zeitpunkt der Spaltenerstellung eine Nicht-Null-Einschränkung hinzufügen (dies wird nicht in der Dokumentation ). Das generierte SQL kann nicht ausgeführt werden.

Problemumgehung

Die in der Frage beschriebene Problemumgehung ist der richtige Weg. Das resultierende SQL lautet:

  1. Fügen Sie die Spalte hinzu

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Legen Sie für jede Zeile einen Nicht-Null-Wert fest

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Fügen Sie die Einschränkung NOT NULL hinzu

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Warum?

Ein Spaltenvorschlag wird nur mit einem INSERT in die Spalte eingefügt . Das "value"-Tag erledigt das für Sie, aber nach Die Spalte wird hinzugefügt. Liquibase versucht, die Spalte in einem Schritt mit NOT NULL hinzuzufügen Einschränkung vorhanden:

ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;

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

Alternative Lösung

Seit PostgreSQL 8.0 (also mittlerweile fast für immer) wäre eine Alternative, die neue Spalte mit einem Nicht-Null-DEFAULT hinzuzufügen :

ALTER TABLE layer
ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';

Das Handbuch: