У меня есть таблица с существующими данными. Есть ли способ добавить первичный ключ без удаления и повторного создания таблицы?
190
У меня есть таблица с существующими данными. Есть ли способ добавить первичный ключ без удаления и повторного создания таблицы?
( Обновлено - спасибо людям, которые прокомментировали )
Предположим, у вас есть таблица с именем test1
, к которой вы хотите добавить автоинкрементный id
столбец первичного ключа (суррогатного). Следующей команды должно быть достаточно в последних версиях PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
В старых версиях 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 это примерно эквивалентно приведенной выше команде.
ADD PRIMARY KEY
также создаетNOT NULL
ограничение (протестировано в Postgres 9.3), как и ожидалось.ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Это все, что вам нужно:
id
столбецКредит дан @resnyanskiy, который дал этот ответ в комментарии.
источник
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Чтобы использовать столбец идентификации в v10,
Для объяснения столбцов идентификации см. Https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
О разнице между GENERATED DEFAULT и GENERATED ВСЕГДА см. Https://www.cybertec-postgresql.com/en/septions-gains-and-pitfalls/ .
Для изменения последовательности см. Https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .
источник
SQL Error [23502]: ERROR: column "id" contains null values
Я приземлился здесь, потому что я тоже искал что-то подобное. В моем случае я копировал данные из набора промежуточных таблиц со многими столбцами в одну таблицу, а также назначал идентификаторы строк для целевой таблицы. Вот вариант вышеуказанных подходов, которые я использовал. Я добавил серийный столбец в конце моей целевой таблицы. Таким образом, мне не нужно иметь заполнитель для этого в операторе вставки. Затем простой выбор * в целевой таблице автоматически заполнил этот столбец. Вот два оператора SQL, которые я использовал в PostgreSQL 9.6.4.
источник