PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Добавянето на ненулева колона към съществуваща таблица е неуспешно. Игнорира ли се атрибутът стойност?

Кратък отговор

Атрибутът „стойност“ няма да работи, ако добавяте ограничение, което не е нула, по време на създаването на колоната (това не е споменато в документация ). Генерираният SQL няма да може да се изпълни.

Заобиколно решение

Заобиколното решение, описано във въпроса, е правилният начин. Полученият SQL ще бъде:

  1. Добавете колоната

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Задайте ненулева стойност за всеки ред

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Добавете ограничението NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Защо?

Колона по подразбиране се вмъква само в колоната с INSERT . Тагът „стойност“ ще направи това вместо вас, но след колоната се добавя. Liquibase се опитва да добави колоната в една стъпка с NOT NULL ограничение на място:

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

... което е невъзможно когато таблицата вече съдържа редове. Просто не е достатъчно умно.

Алтернативно решение

От PostgreSQL 8.0 (така че вече почти завинаги) алтернатива би била да добавите новата колона с ненулев DEFAULT :

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

Ръководството:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. АКТУАЛИЗИРАНЕ с ORDER BY

  2. Използвайте низ [][] с ngpsql

  3. Springboot postgres Неуспешно определяне на подходящ клас драйвер

  4. Не може да се вмъкне JSON от PostgreSQL към elasticsearch. Получаване на грешка - „Изключение при изпълнение на JDBC заявка“

  5. Итериране през записи на PostgreSQL. Как да препратка към данни от следващия ред?