В MySQL каскадное удаление из 2 таблиц
У меня есть схема MySql, которая использует класс таблица наследования, но я хочу, чтобы дочерние таблицы имели каскадное удаление из родительской таблицы и внешней таблицы.
create table parent (
_key bigint unsigned not null,
name varchar(64) unique not null,
primary key(_key)
);
create table child_a (
_key bigint unsigned not null,
foreign_key_a bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_a) references a(_key) on delete cascade,
primary key(_key)
);
create table child_b (
_key bigint unsigned not null,
foreign_key_b bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_b) references b(_key) on delete cascade,
primary key(_key)
);
проблема в том, что когда запись удаляется из одной из внешних таблиц, она удаляет запись из дочерней таблицы, но не из родительской таблицы. Я не хотел бы использовать хранимую процедуру / мульти-оператор в качестве решения, потому что внешние таблицы имеют собственные каскадные удаления, поэтому Для этого мне также понадобятся хранимые процедуры.
1 ответов
ON DELETE CASCADE
удалит строку в таблице с внешним ключом (дочерним), когда строка в таблице, на которую она ссылается (родительская), будет удалена. Без ON DELETE CASCADE
, строка с внешним ключом (дочерним) будет слева, указывая на строку (родительскую), которая больше не существует, и вы получите INTEGRITY CONSTRAINT VIOLATION
.
нет такой проблемы наоборот, удаление ребенка без удаления родителя не оставляет осиротевших строк и нет INTEGRITY CONSTRAINT VIOLATION
что касается MySQL, и каскад не является необходимый.
если вы хотите удалить дочернюю, родительскую и другую указанную строку вместе, у вас есть несколько вариантов.
Multistatement / Процедура:
- Сначала удалите ребенка, затем родителя, а затем другую запись (нет необходимости в
ON DELETE CASCADE
s) - Сначала удалите ребенка, затем другую запись ,а затем родителя (нет необходимости в
ON DELETE CASCADE
s) - Сначала удалите родителя, затем другую запись (только нужно
ON DELETE CASCADE
по родительской ссылке) - Сначала удалите другую запись, затем родительскую (только нужно
ON DELETE CASCADE
по другой ссылке)
триггер:
- поместите триггер на
AFTER DELETE
в дочерней таблице, которая удаляет родительскую и другую запись (в любом порядке), затем удаление ребенка очистит все три записи (нет необходимости вON DELETE CASCADE
s)
изменить отношения:
- если вы можете изменить отношение к другой таблице (a или b), чтобы она ссылалась на ребенка, а не на ребенка, ссылающегося на другую таблицу (как у вас есть в настоящее время), и сохранить
ON DELETE CASCADE
s, удаление родительской строки очистит дочернюю, а затем и другую запись по очереди.