2016-03-17 8 views
8

У меня есть схема MySql, которая использует class table inheritance, но я хочу, чтобы дочерние таблицы имели каскадное удаление из родительской таблицы и внешнюю таблицу.MySql cascade delete from 2 tables

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) 
); 

Вопрос в том, когда запись будет удалена из одной из зарубежных таблиц, он будет удалить запись из таблицы ребенка, но не из родительской таблицы. Я не хотел бы использовать хранимую процедуру/многозадачность в качестве решения, потому что у чужих таблиц есть собственные каскадные удаления, поэтому мне также нужны хранимые процедуры для них.

+0

Оператор ** on delete cascade ** позволяет, когда родитель удален, удалить дочерние элементы, связанные с их внешними ключами. возможно, в вашем случае это не то, что вы должны использовать? –

ответ

11

ON DELETE CASCADE удалит строку в таблице с помощью внешнего ключа (дочернего), когда строка в таблице, на которую он ссылается (родительский), удаляется. Без ON DELETE CASCADE строка с внешним ключом (дочерним) будет указана на строку (родительскую), которая больше не существует, и вы получите INTEGRITY CONSTRAINT VIOLATION.

Нет такой проблемы в обратном направлении, удаление дочернего элемента без удаления родительского элемента не оставляет сиротских строк и INTEGRITY CONSTRAINT VIOLATION в том, что касается MySQL, и никакого каскада не требуется.

Если вы хотите удалить дочерний, родительский и другие ссылочные строки вместе, у вас есть несколько вариантов.

Multistatement/Процедура:

  • Удалить ребенок первым, а затем родитель, а затем другая запись (нет необходимости в ON DELETE CASCADE с)
  • Удаления ребенка первым, а затем другая запись и то родитель (нет необходимости в ON DELETE CASCADE с)
  • Удаление родителя первой, а затем другую запись (нужно только ON DELETE CASCADE на родительской ссылки)
  • Удалить другой запись первый, то родитель (нужно только ON DELETE CASCADE на другой ссылке)

Trigger:

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

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

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