В 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 CASCADEs)
  • Сначала удалите ребенка, затем другую запись ,а затем родителя (нет необходимости в ON DELETE CASCADEs)
  • Сначала удалите родителя, затем другую запись (только нужно ON DELETE CASCADE по родительской ссылке)
  • Сначала удалите другую запись, затем родительскую (только нужно ON DELETE CASCADE по другой ссылке)

триггер:

  • поместите триггер на AFTER DELETE в дочерней таблице, которая удаляет родительскую и другую запись (в любом порядке), затем удаление ребенка очистит все три записи (нет необходимости в ON DELETE CASCADEs)

изменить отношения:

  • если вы можете изменить отношение к другой таблице (a или b), чтобы она ссылалась на ребенка, а не на ребенка, ссылающегося на другую таблицу (как у вас есть в настоящее время), и сохранить ON DELETE CASCADEs, удаление родительской строки очистит дочернюю, а затем и другую запись по очереди.