sql >> Databasteknik >  >> RDS >> PostgreSQL

Att lägga till en icke-nullbar kolumn i befintlig tabell misslyckas. Ignoreras värdeattributet?

Kort svar

Attributet "value" kommer inte att fungera om du lägger till en icke-null-begränsning när kolumnen skapas (detta nämns inte i dokumentation ). SQL som genereras kommer inte att kunna köras.

Lösning

Lösningen som beskrivs i frågan är vägen att gå. Den resulterande SQL-en blir:

  1. Lägg till kolumnen

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Ställ in det till ett icke-nullvärde för varje rad

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Lägg till NOT NULL-begränsningen

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Varför?

En kolumnstandard infogas endast i kolumnen med en INSERT . Taggen "värde" gör det åt dig, men efter kolumnen läggs till. Liquibase försöker lägga till kolumnen i ett steg, med NOT NULL begränsning på plats:

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

... vilket är inte möjligt när tabellen redan innehåller rader. Det är bara inte tillräckligt smart.

Alternativ lösning

Eftersom PostgreSQL 8.0 (så nästan för alltid vid det här laget) skulle ett alternativ vara att lägga till den nya kolumnen med en icke-null DEFAULT :

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

Handboken:



  1. MySQL-parameteriserad fråga med Like

  2. Returnera kortdagens namn från ett datum i Oracle

  3. Vad betyder select count(1) från table_name på alla databastabeller?

  4. Hur man skapar triggers i Codeigniters migreringsbibliotek