Пропуски Senior Базы данных в эксплуатации обновлено

Внешний ключ без долгой блокировки

Вопрос

Добавьте внешний ключ на большую таблицу так, чтобы долгая проверка существующих строк не блокировала запись.

SET lock_timeout = '3s';
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
  FOREIGN KEY (user_id) REFERENCES users(id) __(1)__;
ALTER TABLE orders __(2)__ CONSTRAINT orders_user_fk;

Попробуйте сами

Заполните пропуски по номерам.

1
2
Показать ответ и разбор

Коротко

NOT VALID добавляет ограничение для новых строк без проверки старых, это быстро. VALIDATE CONSTRAINT проверяет существующие строки под более слабой блокировкой (SHARE UPDATE EXCLUSIVE), которая не мешает чтению и записи.

Что в пропусках

1

NOT VALID

2

VALIDATE

Разбор

NOT VALID добавляет ограничение для новых строк без проверки старых, это быстро. VALIDATE CONSTRAINT проверяет существующие строки под более слабой блокировкой (SHARE UPDATE EXCLUSIVE), которая не мешает чтению и записи.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме