Какое поведение по умолчанию при удалении записи, на которую ссылается внешний ключ в Oracle Database?

Ответ

В Oracle Database по умолчанию для внешнего ключа устанавливается ограничение NO ACTION (хотя в документации оно часто синонимично RESTRICT). Это означает, что операция DELETE в родительской таблице будет отклонена, если существуют зависимые записи в дочерней таблице.

Пример создания таблиц с поведением по умолчанию:

CREATE TABLE departments (
    dept_id NUMBER PRIMARY KEY
);

CREATE TABLE employees (
    emp_id NUMBER PRIMARY KEY,
    dept_id NUMBER REFERENCES departments(dept_id) -- ON DELETE NO ACTION по умолчанию
);
-- Попытка удалить отдел с сотрудниками вызовет ошибку ORA-02292.

Альтернативные варианты, которые можно задать явно:

  • ON DELETE CASCADE: автоматическое каскадное удаление зависимых записей.
  • ON DELETE SET NULL: установка NULL в столбце внешнего ключа у зависимых записей.

Ответ 18+ 🔞

А, слушай, вот это прикол! Ну, Oracle, блядь, он такой хитрожопый, всегда по-своему. По дефолту он тебе на внешний ключ вешает NO ACTION. Это типа как RESTRICT, если по-простому. И что это значит, спросишь ты? А значит оно, что если ты в родительской таблице попытаешься удалить запись, на которую кто-то уже ссылается, то Oracle тебе так вежливо намекнёт: «Нихуя, дружок, не выйдет». Просто отклонит операцию и всё, в рот меня чих-пых!

Вот смотри, как это выглядит в жизни, чтоб совсем понятно было:

CREATE TABLE departments (
    dept_id NUMBER PRIMARY KEY
);

CREATE TABLE employees (
    emp_id NUMBER PRIMARY KEY,
    dept_id NUMBER REFERENCES departments(dept_id) -- ON DELETE NO ACTION по умолчанию
);
-- Попытка удалить отдел с сотрудниками вызовет ошибку ORA-02292.

Представь: создал ты отдел, нанял туда сотрудничков. А потом такой: «А давайте-ка этот отдел нахуй удалим!». А база тебе: «Мужик, ты что, охуел? Там же люди сидят!». И выдаст тебе ошибку ORA-02292. Вот и весь сказ, блядь.

Но, конечно, если ты не конченый максималист, как тот Герасим из рассказа, есть и другие, более гибкие варианты. Их можно явно прописать, чтоб не было потом неожиданностей, ёпта.

  • ON DELETE CASCADE: Это по-нашему, по-русски — «мочи всех». Удалил отдел — и все сотрудники из него автоматом, без лишних вопросов, летят в корзину. Жестко, зато чисто.
  • ON DELETE SET NULL: А это уже более гуманно, типа «отпусти с миром». Удалил отдел — и у всех его бывших сотрудников в графе «отдел» теперь красуется NULL. Сидят, бедолаги, без дела, как сука пёс Муму на берегу, и думают: «А куда ж нам теперь, блядь?».

Вот так-то. Выбирай, что тебе ближе по душе, но помни про дефолтное поведение, а то охуеешь потом, когда удалить ничего не сможешь!