#postgresql
#postgresql
Вопрос:
У меня есть таблица с составным ПК (code_id, user_id), в которой уже есть 100 тыс. записей. Безопасно ли переходить с составного ПК на одиночный ПК, как в примере ниже?
ALTER TABLE orders
DROP CONSTRAINT pk_code_id_user_id,
ADD COLUMN order_id SERIAL,
ADD CONSTRAINT pk_order_id PRIMARY KEY (order_id);
Ответ №1:
Да, это безопасно и будет работать.
Единственная проблема заключается в том, что выполнение этого утверждения может занять некоторое время:
-
все строки должны обновляться с
DEFAULT
значением последовательности -
создается новый уникальный индекс
-
PostgreSQL проверяет это
order_id IS NOT NULL
для всех строк
В течение этого времени таблица заблокирована в ACCESS EXCLUSIVE
режиме, поэтому она недоступна даже для одновременного чтения.
Но с такой крошечной таблицей это не должно быть большой проблемой.
Все усложняется, если существуют ограничения внешнего ключа, которые ссылаются на старое ограничение первичного ключа. Вам также придется отказаться от них и подумать о хорошей замене.
Комментарии:
1. Спасибо, составной индекс (code_id, user_id) также будет удален pg или он останется после изменений pk?
2. ДА. Если вы удалите ограничение, индекс, который его реализует, автоматически удалится.