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

Tilføjelse af en ikke-nullbar kolonne til eksisterende tabel mislykkes. Bliver værdiegenskaben ignoreret?

Kort svar

"Værdi"-attributten fungerer ikke, hvis du tilføjer en ikke-nul-begrænsning på tidspunktet for oprettelse af kolonnen (dette er ikke nævnt i dokumentation ). Den genererede SQL vil ikke være i stand til at udføre.

Løsning

Løsningen beskrevet i spørgsmålet er vejen at gå. Den resulterende SQL vil være:

  1. Tilføj kolonnen

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Indstil den til en ikke-nul værdi for hver række

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Tilføj NOT NULL-begrænsningen

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Hvorfor?

En kolonnestandard indsættes kun i kolonnen med en INSERT . "Værdi"-tagget vil gøre det for dig, men efter kolonnen tilføjes. Liquibase forsøger at tilføje kolonnen i ét trin med NOT NULL begrænsning på plads:

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

... hvilket er ikke muligt når tabellen allerede indeholder rækker. Det er bare ikke smart nok.

Alternativ løsning

Siden PostgreSQL 8.0 (så næsten for evigt efterhånden) ville et alternativ være at tilføje den nye kolonne med en ikke-null DEFAULT :

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

Manualen:



  1. Hvordan gemmer man NULL-værdier i datetime-felter i MySQL?

  2. Sådan migreres MS SQL-database, der kører på fjernmaskine, til min lokale MySQL-database, der kører på linux, og bevarer kodning

  3. Er det muligt at køre apriori association regel i mysql statement?

  4. Hvordan kan jeg lave denne dynamiske opdatering i Oracle?