我有两张桌子。表格参考表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中我也无法删除a如果b仍然存在,所以我先删除b。
但是什么决定了先来的顺序呢?
这些表是alla InnoDB。
我该怎么办?
由于
答案 0 :(得分:2)
MySQL manual说多表DELETE和外键:
如果使用多表DELETE 涉及InnoDB表的声明 哪个有外键 约束, MySQL优化器可能 按顺序处理表 不同于他们的 父母/子女关系。在这 声明,声明失败并滚动 背部。相反,你应该删除 单表并依靠ON 删除功能即InnoDB 提供导致其他表 相应修改。
因此,当主表中的记录被删除时,其外来引用也是如此,例如:
ALTER TABLE products
ADD CONSTRAINT fk_supplier
FOREIGN KEY (supplier_id, supplier_name)
REFERENCES supplier(supplier_id, supplier_name)
ON DELETE CASCADE;
答案 1 :(得分:0)
您的删除语法无效。您需要在两个语句中执行此操作(除非提到nuqqsa,否则在表a和表b之间的关系上启用了CASCADE DELETE):
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'
决定哪个首先是外键关系。无论哪个表是父表,都必须从最后删除。