здесь усеченную пример моей проблемы:каскадные удаления не работает при удалении из «группировки таблицы»
создать 2 таблицы, которые связаны через «группировки таблицы».
CREATE TABLE table1
(
t1_pk INT(11) AUTO_INCREMENT NOT NULL,
t1_entry VARCHAR(150),
PRIMARY KEY (t1_pk)
) engine = innodb;
CREATE TABLE table2
(
t2_pk int(11) AUTO_INCREMENT NOT NULL,
t2_entry VARCHAR(150),
PRIMARY KEY (t2_pk)
) engine = innodb;
CREATE TABLE grouping
(
grouping_pk INT(11) AUTO_INCREMENT NOT NULL,
t1_fk INT(11) NOT NULL,
t2_fk INT(11) NOT NULL,
PRIMARY KEY (grouping_pk),
CONSTRAINT table1_fk FOREIGN KEY (t1_fk) REFERENCES table1 (t1_pk) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT table2_fk FOREIGN KEY (t2_fk) REFERENCES table2 (t2_pk) ON DELETE CASCADE ON UPDATE CASCADE
) engine = innodb;
Теперь я хочу, чтобы удалить все записи из группировки, table1 и table2 где table1.t1_entry является «а».
Я пытаюсь сделать это следующим образом:
DELETE FROM grouping
WHERE grouping.grouping_pk IN (SELECT
temp.entry_id
FROM (SELECT grouping.grouping_pk,
grouping.t1_fk,
grouping.t2_fk,
table1.t1_pk,
table1.t1_entry,
table2.t2_pk,
table2.t2_entry
FROM grouping
LEFT OUTER JOIN table1 ON grouping.t1_fk = table1.t1_pk
LEFT OUTER JOIN table2 ON grouping.t2_fk = table2.t2_pk
WHERE table1.t1_entry LIKE 'abc'
) AS temp)
В результате записи будут удалены в таблице группировки, но не в table1 и table2.
Вопрос теперь, как я мог выбрать записи и удалить набор результатов из всех таблиц? Я чувствую себя манекеном, потому что я не могу понять это сам.
При удалении из таблицы ссылок удаляется только каскад, а не из таблицы ссылок. Вам разрешено иметь элементы, которые не входят в какую-либо группировку, но вам не разрешено группировать, что относится к несуществующим элементам. – Barmar
Если вы хотите удалить из других таблиц, когда все группы исчезнут, вам нужно использовать триггер. – Barmar
Правило ON DELETE внешнего ключа работает в обратном порядке, как вы думаете об этом. Если правило DELETE указано как CASCADE так, как вы его ... если строка удалена из ** 'table1' **, то соответствующие строки в **' grouping' ** будут автоматически удалены. Удаление строк из ** 'grouping' ** не влияет на строки в **' table1' **. – spencer7593