В следующем примере:
1. Сначала создается PRIMARY KEY по столбцу id
Код: Выделить всё
demo=# CREATE TABLE test (id INT, text_data TEXT);
CREATE TABLE
demo=# INSERT INTO test (id, text_data) SELECT x, 'TEXT' || x FROM generate_series(1,100) x;
INSERT 0 100
demo=# ALTER TABLE test ADD CONSTRAINT test_pk PRIMARY KEY (id);
ALTER TABLE
Код: Выделить всё
demo=# CREATE UNIQUE INDEX CONCURRENTLY test_id_text_ix ON test (id, text_data);
CREATE INDEX
demo=# ALTER TABLE test DROP CONSTRAINT test_pk, ADD CONSTRAINT test_pk2 PRIMARY KEY USING INDEX test_id_text_ix;
NOTICE: ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index "test_id_text_ix" to "test_pk2"
ALTER TABLE
demo=# \d+ test
Table "demo.test"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
-----------+---------+-----------+----------+---------+----------+-------------+--------------+-------------
id | integer | | not null | | plain | | |
text_data | text | | not null | | extended | | |
Indexes:
"test_pk2" PRIMARY KEY, btree (id, text_data)
Access method: heap
В тоже время из описания таблицы test видно, что индекс test_pk дропается вместе со старым ограничением test_pk. Также при добавлении первичного ключа конструкцией USING INDEX, индекс переименовывается и дропнется при удалении соответствующего ему констрейнту. Существует ли возможность отвязки уникального индекса от PRIMARY KEY, чтобы не создавать его после удаления констрейнта заново?