PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

L'aggiunta di una colonna non annullabile alla tabella esistente non riesce. L'attributo value viene ignorato?

Risposta breve

L'attributo "value" non funzionerà se stai aggiungendo un vincolo non nullo al momento della creazione della colonna (questo non è menzionato in documentazione ). L'SQL generato non potrà essere eseguito.

Soluzione alternativa

La soluzione descritta nella domanda è la strada da percorrere. L'SQL risultante sarà:

  1. Aggiungi la colonna

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Impostalo su un valore non nullo per ogni riga

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Aggiungi il vincolo NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Perché?

Una colonna predefinita viene inserita solo nella colonna con un INSERT . Il tag "value" lo farà per te, ma dopo la colonna viene aggiunta. Liquibase prova ad aggiungere la colonna in un solo passaggio, con il NOT NULL vincolo in atto:

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

... che non è possibile quando la tabella contiene già righe. Semplicemente non è abbastanza intelligente.

Soluzione alternativa

Da PostgreSQL 8.0 (quindi quasi per sempre ormai) un'alternativa sarebbe aggiungere la nuova colonna con un DEFAULT non nullo :

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

Il manuale: