create table a
( ...
, b_id bigint default null comment 'fk ref b.id'
, constraint a_b_id foreign key (b_id) reference b (id) on delete set null
, ...
) engine=innodb
таблицы x
и y
определены аналогично, с пустыми столбцами внешнего ключа
create table x
( ...
, b_id bigint default null comment 'fk ref b.id'
, constraint x_b_id foreign key (b_id) references b (id) on delete set null
, ...
) engine=innodb
и
create table y
( ...
, b_id bigint default null comment 'fk ref b.id'
, constraint y_b_id foreign key (b_id) references b (id) on delete set null
, ...
) engine=innodb
Когда строка удаляется из b
, то любые значения столбца b_id
в любой из трех таблиц ссылаются на удаленную строку, эти значения будут изменены на NULL.
В MySQL нет декларативного ограничения, которое будет выполнять 3.
«Если я удаляю из a и если данному a соответствует b, этот b следует удалить.»
Возможно, нам удастся сделать это с помощью TRIGGER, но мы столкнемся с некоторыми проблемами, на которые могут ссылаться таблицы на операторы в триггере. Это, вероятно, лучше обрабатывать логикой приложения, а не правилом базы данных или триггером.
Если я собирался сделать попытку триггера, то что-то вроде
DELIMITER $$
CREATE TRIGGER a_ad
AFTER DELETE ON a
FOR EACH ROW
BEGIN
DELETE FROM b WHERE b.id = OLD.b_id ;
END$$
DELIMITER ;
(Я не уверен, что это будет разрешено, или если будет выдано сообщение об ошибке ... рассмотрим
table b
---------
row id=42
и
table a
-------
row id=2 b_id=42
row id=3 b_id=42
рассмотрим этот оператор SQL
DELETE FROM a WHERE a.id IN (2,3);
Удаление строки id=2
запускает триггер "после удаления"; и он выполнит DELETE для b
, внешний ключ найдет строку id=3
, на которую ссылается, и попытается установить для столбца b_id
значение NULL ... но эта строка может быть уже заблокирована исходным оператором DELETE. .. Я просто не уверен, что произойдет в этом сценарии; и мы сталкиваемся с некоторыми ограничениями на триггеры (например, на изменение строк в таблицах, на которые ссылается оператор, запускающий триггер)