sql >> Database >  >> RDS >> PostgreSQL

Het toevoegen van een niet-nulbare kolom aan een bestaande tabel mislukt. Wordt het waardekenmerk genegeerd?

Kort antwoord

Het kenmerk "value" werkt niet als u een niet-null-beperking toevoegt op het moment dat de kolom wordt gemaakt (dit wordt niet vermeld in de documentatie ). De gegenereerde SQL kan niet worden uitgevoerd.

Tussenoplossing

De oplossing die in de vraag wordt beschreven, is de juiste keuze. De resulterende SQL is:

  1. Voeg de kolom toe

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Stel het in op een niet-null-waarde voor elke rij

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Voeg de NOT NULL-beperking toe

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Waarom?

Een standaardkolom wordt alleen ingevoegd in de kolom met een INSERT . De tag "value" doet dat voor u, maar na de kolom wordt toegevoegd. Liquibase probeert de kolom in één stap toe te voegen, met de NOT NULL beperking aanwezig:

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

... wat niet mogelijk is wanneer de tabel al rijen bevat. Het is gewoon niet slim genoeg.

Alternatieve oplossing

Sinds PostgreSQL 8.0 (dus bijna voor altijd) zou een alternatief zijn om de nieuwe kolom toe te voegen met een niet-null DEFAULT :

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

De handleiding:



  1. Prestaties van verschillende benaderingen van op tijd gebaseerde gegevens

  2. Big Data met PostgreSQL en Apache Spark

  3. Onjuiste tekenreeksfout bij het toevoegen van emoji aan een database via een formulier

  4. SQL Server automatische update datetimestamp veld