Создание последовательности на существующей таблице - PullRequest
26 голосов
/ 27 февраля 2012

Как я могу создать последовательность в таблице, чтобы она шла от 0 до> максимального значения?Я попытался использовать следующий код SQL, но он не вставляет никаких значений в таблицу, которую я использую:

CREATE SEQUENCE rid_seq;
ALTER TABLE test ADD COLUMN rid INTEGER;
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq');

Таблица, в которой я пытаюсь вставить последовательность, является выводом из другого запроса,Я не могу понять, имеет ли смысл добавлять последовательность во время этого начального запроса или добавлять последовательность в таблицу после выполнения запроса.

Ответы [ 3 ]

40 голосов
/ 27 февраля 2012

Установка значения по умолчанию при добавлении нового столбца:

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');

Изменение значения по умолчанию для существующих столбцов не приводит к изменению существующих данных, поскольку в базе данных нет способа узнать, какие значения следует изменить;в значениях столбцов отсутствует флаг «этот столбец имеет значение по умолчанию», есть только значение по умолчанию (изначально NULL, поскольку вы не указали ничего другого) и текущее значение (также NULL), но способ определить разницу между «NULL»потому что это по умолчанию "и" NULL, потому что он был явно установлен в NULL ".Таким образом, когда вы делаете это в два этапа:

  1. Добавить столбец.
  2. Изменить значение по умолчанию.

PostgreSQL не будет применять значение по умолчанию кстолбец, который вы только что добавили.Однако, если вы добавляете столбец и одновременно предоставляете значение по умолчанию, PostgreSQL знает, какие строки имеют значение по умолчанию (все они), поэтому он может предоставлять значения при добавлении столбца.

ПоКстати, вы, вероятно, также хотите иметь значение NOT NULL для этого столбца:

create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');

И, как примечания a_horse_with_no_name , если вы собираетесь использовать rid_seq только для своего столбца test.rid, тогдаВы можете установить для столбца владельца значение test.rid, чтобы при удалении столбца последовательность была отброшена:

alter sequence rid_seq owned by test.rid;
1 голос
/ 28 сентября 2016

В PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence')
WHERE your_column IS NULL;
0 голосов
/ 27 февраля 2012

Я не бегло говорю на postgresql, поэтому не знаком с выражением "CREATE SEQUENCE" Я думаю, что вы добавляете определение столбца правильно. Однако добавление столбца не приводит к автоматической вставке данных для существующих строк. Ограничение DEFAULT предназначено для новых строк. Попробуйте добавить что-то подобное потом, чтобы заполнить данные в существующих строках.

DECLARE @i Int
SET @i = 0
SET ROWCOUNT 1
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN
   UPDATE test SET rid = @i WHERE rid IS NULL
END
SET ROWCOUNT 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...