Как добавить автоматически увеличивающийся первичный ключ в существующую таблицу в PostgreSQL?
У меня есть таблица с существующими данными. Есть ли способ, чтобы добавить первичный ключ без удаления и повторного создания таблицы?
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;
Это все, что вам нужно:
- добавить
id
колонки - заполните его последовательностью от 1 до count (*).
- установите его как первичный ключ / не 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/.
Я приземлился здесь, потому что я искал что-то подобное тоже. В моем случае я копировал данные из набора промежуточных таблиц со многими столбцами в одну таблицу, а также назначал идентификаторы строк целевой таблице. Вот вариант вышеуказанных подходов, которые я использовал. Я добавил столбец serial в конце моей целевой таблицы. Таким образом, мне не нужно иметь заполнитель для него в инструкции Insert. Затем простой select * в целевой таблице автоматически заполняет этот столбец. Здесь два оператора SQL, которые я использовал на PostgreSQL 9.6.4.
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;