sql >> Databáze >  >> RDS >> PostgreSQL

Přidání sloupce bez možnosti Null do existující tabulky se nezdaří. Je atribut value ignorován?

Krátká odpověď

Atribut "value" nebude fungovat, pokud přidáváte omezení nenulové v době vytváření sloupce (toto není zmíněno v dokumentaci ). Vygenerované SQL nebude možné provést.

Řešení

Řešení popsané v otázce je cesta. Výsledné SQL bude:

  1. Přidejte sloupec

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Nastavte jej na nenulovou hodnotu pro každý řádek

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Přidejte omezení NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Proč?

Výchozí sloupec se vloží pouze do sloupce pomocí INSERT . Značka „value“ to udělá za vás, ale po sloupec je přidán. Liquibase se pokusí přidat sloupec v jednom kroku s NOT NULL omezení na místě:

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

... což není možné když tabulka již obsahuje řádky. Prostě to není dost chytré.

Alternativní řešení

Od PostgreSQL 8.0 (tedy téměř navždy) by alternativou bylo přidat nový sloupec s nenulovým DEFAULT :

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

Příručka:



  1. Jak mohu importovat databázi s MySQL z terminálu?

  2. TSQL:Jak převést místní čas na UTC? (SQL Server 2008)

  3. Je povoleno používat čísla jako názvy tabulek v MySQL?

  4. Co jsou uživatelská oprávnění databáze?