MySQL Multi DELETE Если существует связь с внешним ключом - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь (в одном выражении) удалить строку и все ее отношения, даже если все эти отношения не существуют. Каскад при удалении недоступен, и я бы предпочел избегать подзапросов.

Вот пример того, что не получается из-за отношений с внешним ключом:

CREATE TABLE test(id integer, title varchar(100), primary key(id));
INSERT into test(id, title) values(1, "Hello");
CREATE TABLE ref_a(id integer, test_id integer, primary key(id), key(test_id), constraint foreign key(test_id) references test(id));
INSERT into ref_a(id, test_id) values(1, 1);
CREATE TABLE ref_b(id integer, test_id integer, primary key(id), key(test_id), constraint foreign key(test_id) references test(id));
SET GLOBAL FOREIGN_KEY_CHECKS=1;


DELETE test, ref_a, ref_b FROM test
LEFT JOIN ref_a ON ref_a.test_id = test.id
LEFT JOIN ref_b ON ref_b.test_id = test.id
WHERE test.id = 1;

Это не с ошибкой

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`product`.`ref_a`, CONSTRAINT `ref_a_ibfk_1` FOREIGN KEY (`test_id`) REFERENCES `test` (`id`))

Возможно ли это сделать?

БД - это InnoDb. MySql v 5.6.36

1 Ответ

1 голос
/ 02 июля 2019

Для вашего выпуска есть три варианта:

  1. Включить ON DELETE CASCADE. Но это не вариант в вашем случае, по-видимому

  2. Отключите foreign_key_checks перед выполнением запроса, а затем повторно включите его

  3. Выполнить два запроса; сначала удаляя ссылочные строки (ref_a, ref_b), затем строки в test

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

...