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

Как добавить автоматически увеличивающий первичный ключ к существующей таблице в PostgreSQL?

У меня есть таблица с существующими данными. Есть ли способ добавить первичный ключ без удаления и повторного создания таблицы?

4b9b3361

Ответ 1

(Обновлено - спасибо людям, которые прокомментировали)

Современные версии PostgreSQL

Предположим, что у вас есть таблица с именем test1, к которой вы хотите добавить автоинкрементный, первичный ключ id (суррогатный) столбец. Следующая команда должна быть достаточной в последних версиях PostgreSQL:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Старые версии PostgreSQL

В старых версиях PostgreSQL (до 8.x?) вам пришлось выполнять всю грязную работу. Следующая последовательность команд должна выполнить трюк:

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

Опять же, в последних версиях Postgres это примерно эквивалентно одной команде выше.

Ответ 2

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Это все, что вам нужно:

  • Добавьте столбец id
  • Заполните его с помощью последовательности из 1 для подсчета (*).
  • Установите его как первичный ключ/не null.

Кредит предоставляется @resnyanskiy, который дал этот ответ в комментарии.

Ответ 3

Я приземлился здесь, потому что искал что-то подобное. В моем случае я копировал данные из набора промежуточных таблиц со многими столбцами в одну таблицу, а также присваивал идентификаторы строк целевой таблице. Вот вариант вышеупомянутых подходов, которые я использовал. Я добавил серийный столбец в конце моей целевой таблицы. Таким образом, мне не нужно иметь местозаполнитель для этого в инструкции Insert. Затем простой select * в целевую таблицу автоматически заполняет этот столбец. Вот два оператора SQL, которые я использовал в PostgreSQL 9.6.4.

ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;