Добавление столбца со значением по умолчанию в существующую таблицу в postgresql

#sql #postgresql #ddl

Вопрос:

Вопрос:
Существует ли запрос postgres для добавления нового столбца в существующую таблицу и автоматического заполнения этого столбца для всех строк таблицы определенным значением, скажем "A1" , только один раз, при создании столбца, чтобы я все равно мог установить значение столбца по УМОЛЧАНИЮ на другоедопустим, значение "B2" ?

Просто чтобы было ясно, я ищу что-то вроде этого:

Учитывая my_table :

 name   |   work
------------------------
bob    |  fireman
carl   |  teacher
alice  |  policeman
 

мой запрос

 ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT "B2"
COMMAND_I_D_WISH_TO_KNOW "A1";
 

изменения my_table в

 name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"
 

так что, если после этого я выполню запрос

 INSERT INTO my_table(name, work)
VALUES karen, developer;
 

my_tables становится

 name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"
karen  |  developer   | "B2"
 

Ответ №1:

Да, вы можете сделать это, используя два действия в одном ИЗМЕНЕНИИ.

 ALTER TABLE my_table 
  ADD COLUMN description varchar(100) DEFAULT 'A1', 
  ALTER COLUMN description SET DEFAULT 'B2';
 

Я проверил, что DROP DEFAULT это не работает в той же команде, в которой был добавлен столбец, в отличие SET DEFAULT NULL от . Я не думаю, что на самом деле есть причина, по которой это не работает, просто случается, что они выполняются в неправильном порядке, чтобы это работало, и никто не потрудился заставить его делать это в правильном порядке. порядок. (Возможно, потому, что никто даже не проверял эту точную вещь и поэтому понимает, что она сломана)

Вы всегда можете просто выполнить их в разных ALTER командах. Если вы беспокоитесь, что кто-то может «увидеть» таблицу в промежуточном состоянии, вы можете сделать и то, и другое в одной транзакции. Тогда блокировка не снимается между ними, поэтому никто не может ее увидеть. Реальное преимущество выполнения нескольких действий в одной команде заключается в том, что таблицу не нужно переписывать несколько раз. Но здесь его вообще не нужно переписывать.

Комментарии:

1. Работает для меня в нескольких версиях. Какую версию вы используете? Есть ли у них что-нибудь странное в таблице (внешняя, временная, разделенная и т. Д.)

2. Вы можете увидеть, как это работает на db-fiddle.com/f/2CFNtdkLbc324etcsSrNTq/0

3. мой плохой, это работает, я удалю свои комментарии

4. Я просто не понимаю, почему это не работает, когда я заменяю строку ALTER COLUMN description SET DEFAULT 'B2'; на строку ALTER COLUMN description DROP DEFAULT; . Чтобы удалить значение по умолчанию, только ALTER COLUMN description SET DEFAULT NULL кажется, что работает.

Ответ №2:

Ссылаясь на самые последние документы, эта операция может быть выполнена с помощью двух операторов.

  1. Добавляет столбец со старым значением по умолчанию

ALTER TABLE my_table ADD COLUMN description varchar(100) DEFAULT 'A1';

  1. Изменяет столбец, чтобы использовать другое значение по умолчанию

ALTER TABLE my_table ALTER COLUMN description SET DEFAULT 'B2'

Ниже приведен полный воспроизводимый образец:

 CREATE TABLE my_table (
  "name" VARCHAR(5),
  "work" VARCHAR(9)
);

INSERT INTO my_table
  ("name", "work")
VALUES
  ('bob', 'fireman'),
  ('carl', 'teacher'),
  ('alice', 'policeman');
 

Запрос #1

 select * from my_table;
 
Имя работа
боб пожарный
карл Учительница
Алиса полицейский

Запрос # 2

 ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT 'A1';
 

Результаты не отображаются.


Запрос #3

 select * from my_table;
 
Имя работа Описание
боб пожарный А1
карл Учительница А1
Алиса полицейский А1

Запрос #4

 ALTER TABLE my_table 
ALTER COLUMN description SET DEFAULT 'B2';
 

Результаты не отображаются.


Запрос #5

 INSERT INTO my_table("name", "work")
VALUES ('karen', 'developer');
 

Результаты не отображаются.


Запрос #6

 select * from my_table;
 
Имя работа Описание
боб пожарный А1
карл Учительница А1
Алиса полицейский А1
карен Разработчик B2

Просмотр рабочей демонстрации в DB Fiddle

Дайте мне знать, если это сработает для вас.

Комментарии:

1. Спасибо, я спрашивал, есть ли способ запустить команды «обновить таблицу, добавив новый столбец и установив для него значение по умолчанию A1» и «обновить таблицу, установив для нового столбца значение по умолчанию B2» одновременно, всего одним запросом.

2. @Tms91 Вы задали хороший вопрос. Однако я не вижу такого в последних документах (на момент написания этого сообщения). Возможно, они рассмотрят это для будущих версий, вы можете отправить запрос здесь или привлечь их дальше .