#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:
Ссылаясь на самые последние документы, эта операция может быть выполнена с помощью двух операторов.
- Добавляет столбец со старым значением по умолчанию
ALTER TABLE my_table ADD COLUMN description varchar(100) DEFAULT 'A1';
- Изменяет столбец, чтобы использовать другое значение по умолчанию
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 Вы задали хороший вопрос. Однако я не вижу такого в последних документах (на момент написания этого сообщения). Возможно, они рассмотрят это для будущих версий, вы можете отправить запрос здесь или привлечь их дальше .