У меня есть две таблицы. представьте в виде таблицы ссылочную таблицу b, которой я верю.
Когда я пытаюсь удалить пакет в целом как это:
$query="DELETE a, b FROM classified as a, $sql_table as b WHERE a.ad_id = '$id'
AND a.classified_id = b.classified_id AND a.poster_password='$pass'";
b ДОЛЖЕН быть удален сначала, я предполагаю. Даже в PhpMyAdmin я не могу удалить, если b все еще там, таким образом, я удаляю b сначала.
Но что решает порядок, в котором на первом месте?
Таблицы являются alla InnoDB.
Что мне делать?
Спасибо
Ваш синтаксис удаления недействителен. Вам нужно сделать это в двух инструкциях (если, как указано в nuqqsa, у вас включен CASCADE DELETE для связи между таблицей a и таблицей b):
Delete From b
Where Exists (
Select 1
From a
Where a.poster_password = '$pass'
And a.ad_id = '$id'
And a.classified_id = b.classified_id
)
Delete From a
Where a.poster_password = '$pass'
And a.ad_id = '$id'
Что решает, что будет первым, так это отношения внешних ключей. Какая бы таблица ни была родительской, ее необходимо удалить из последней.
Руководство MySQL говорит о многостоличном DELETE и внешних клавишах:
Если вы используете многостоличный DELETE оператор, включающий таблицы InnoDB для у которых есть внешний ключ ограничения, может оптимизатор MySQL обрабатывать таблицы в том порядке, который отличается от их отношения родитель/ребёнок. В этом Case, оператор завершается сбоем и сворачивается Назад. Вместо этого вы должны удалить из единая таблица и положитесь на ON ВОЗМОЖНОСТИ УДАЛЕНИЯ InnoDB Предоставляется для того, чтобы другие таблицы быть изменены соответствующим образом.
Таким образом, когда запись в вашей основной таблице удаляется, удаляются и ее внешние ссылки, например:
ALTER TABLE products
ADD CONSTRAINT fk_supplier
FOREIGN KEY (supplier_id, supplier_name)
REFERENCES supplier(supplier_id, supplier_name)
ON DELETE CASCADE;