Подтвердить что ты не робот

Создание последовательности в существующей таблице

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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;

Ответ 2

В PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence')
WHERE your_column IS NULL;

Ответ 3

Я не уверен в 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