Как добавить автоинкрементный первичный ключ в существующую таблицу в PostgreSQL? - PullRequest
157 голосов
/ 31 мая 2010

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

Ответы [ 4 ]

293 голосов
/ 31 мая 2010

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

Современные версии 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 это примерно эквивалентно приведенной выше единственной команде.

47 голосов
/ 04 мая 2015
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

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

  1. Добавить столбец id
  2. Заполните его последовательностью от 1 до количества (*).
  3. Установить его как первичный ключ / не ноль.

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

5 голосов
/ 07 марта 2018

Чтобы использовать столбец идентификаторов в v10,

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;

Объяснение столбцов идентификации см. https://blog.2ndquadrant.com/postgresql-10-identity-columns/.

О разнице между Генерируемыми по умолчанию и Генерированными ВСЕГДА см. https://www.cybertec -postgresql.com / ru / sequence-gains-and-pitfalls / .

Об изменении последовательности см. https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/.

2 голосов
/ 23 ноября 2017

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

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