PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dodanie kolumny niedopuszczającej wartości null do istniejącej tabeli kończy się niepowodzeniem. Czy atrybut wartości jest ignorowany?

Krótka odpowiedź

Atrybut „value” nie zadziała, jeśli podczas tworzenia kolumny dodajesz ograniczenie o wartości niezerowej (nie jest to wspomniane w dokumentacja ). Wygenerowany kod SQL nie będzie mógł zostać wykonany.

Obejście

Rozwiązanie opisane w pytaniu to droga do zrobienia. Wynikowy kod SQL będzie wyglądał następująco:

  1. Dodaj kolumnę

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Ustaw wartość inną niż null dla każdego wiersza

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Dodaj ograniczenie NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Dlaczego?

Domyślna kolumna jest wstawiana tylko do kolumny z INSERT . Tag „value” zrobi to za Ciebie, ale po kolumna jest dodawana. Liquibase próbuje dodać kolumnę w jednym kroku, z NOT NULL ograniczenie w miejscu:

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

... co jest niemożliwe gdy tabela zawiera już wiersze. To po prostu nie jest wystarczająco inteligentne.

Alternatywne rozwiązanie

Od PostgreSQL 8.0 (tak więc prawie na zawsze) alternatywą byłoby dodanie nowej kolumny z niepustą DEFAULT :

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

Podręcznik:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najważniejsze rzeczy do monitorowania w PostgreSQL — analiza obciążenia

  2. Różnica Postgresql między datami w dwóch kolumnach?

  3. date_sub ok z mysql, ko z postgresql

  4. Postgresql COPY CSV ERROR:dodatkowe dane po ostatniej oczekiwanej kolumnie

  5. Zapytanie Rails 3:pojawia się błąd podczas używania 'select' z 'order'