Ответ
В 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. Сидят, бедолаги, без дела, как сука пёс Муму на берегу, и думают: «А куда ж нам теперь, блядь?».
Вот так-то. Выбирай, что тебе ближе по душе, но помни про дефолтное поведение, а то охуеешь потом, когда удалить ничего не сможешь!