我有一个表,表示table1有50条记录,table1的记录与其他子表使用约束绑定。
并非所有50条记录都有约束,可能没有约束的记录很少(比如15条),所以我想运行一个删除查询,在总共50条记录中单独删除15个条目。
我尝试了delete ignore
声明:
delete ignore from table1;
但它没有帮助&我收到了这个错误:
无法删除或更新父行: 外键约束失败
在mysql查询中实现此目的的最佳方法是什么?
答案 0 :(得分:0)
DELETE FROM table1 WHERE NOT EXISTS (SELECT * FROM details_table d WHERE d.table1_id = table1.id)
答案 1 :(得分:0)
这是一个简单,易读,高效的查询,可以为您完成:
DELETE FROM table1
WHERE id NOT IN (
SELECT table1_id FROM details_table_1
UNION
SELECT table1_id FROM details_table_2
-- more unions to other child tables as required
);
答案 2 :(得分:0)
我一直希望加入使用IN()
http://dev.mysql.com/doc/refman/5.5/en/rewriting-subqueries.html
有时还有其他方法可以测试 一组值的成员资格而不是 使用子查询。还有一些 场合,它不仅可能 重写没有子查询的查询, 但它可以更有效率 相反,使用其中一些技术 而不是使用子查询。其中之一 是IN()构造。
...
LEFT [OUTER] JOIN
可能比...更快 一个等价的子查询,因为 服务器可能能够优化它 更好 - 一个不具体的事实 仅MySQL服务器。在SQL-92之前, 外连接不存在,所以 子查询是唯一的方法 确定的事情。今天,MySQL服务器 和许多其他现代数据库系统 提供广泛的外部连接 类型。
以下是使用LEFT OUTER JOIN
:
DELETE FROM table1
LEFT OUTER JOIN child_table_1 c1 ON table1.id = c1.table_1_id
LEFT OUTER JOIN child_table_2 c2 ON table1.id = c2.table_1_id
-- More joins for additional child tables here
WHERE c1.table_1_id IS NULL
AND c2.table_1_id IS NULL
-- AND other child tables
;