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



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

6595   4  

4 ответов:

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

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

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

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

  1. добавить id колонки
  2. заполнить его с последовательностью от 1 до count (*).
  3. установите его в качестве первичного ключа / not null.

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

чтобы использовать столбец идентификаторов в 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/en/sequences-gains-and-pitfalls/.

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

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

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

Comments

    Ничего не найдено.