Неблокирующая модификация первичного ключа

«Пост-Грэс-Кью-Эл» свободная объектно-реляционная СУБД. Обмениваемся вопросами и ответами о её работе.
Ответить
AntonS
Сообщения: 86
Зарегистрирован: Пт июн 03, 2022 8:51 am

Неблокирующая модификация первичного ключа

Сообщение AntonS »

PostgreSQL умеет модифицировать ограничение PRIMARY KEY без блокировки изменений в процессе перестроения индекса, как утверждает документация.

В следующем примере:

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
2. Затем добавляется еще один столбец text_data.

Код: Выделить всё

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_id_text_ix таблица не блокировалась, запросы и транзакции по ней могли продолжать работать.

В тоже время из описания таблицы test видно, что индекс test_pk дропается вместе со старым ограничением test_pk. Также при добавлении первичного ключа конструкцией USING INDEX, индекс переименовывается и дропнется при удалении соответствующего ему констрейнту. Существует ли возможность отвязки уникального индекса от PRIMARY KEY, чтобы не создавать его после удаления констрейнта заново?
Ответить