我有一个表,比如table1,有50条记录,表1的记录与其他使用约束的子表捆绑在一起。
并不是所有的50条记录都有约束,没有约束的记录可能很少(比如15条),所以我想运行一个delete查询,仅删除总共50个条目中的15个。
我尝试了delete ignore声明:
delete ignore from table1;但这并没有帮助&我得到了一个错误:
无法删除或更新父行:外键约束失败
在mysql查询中实现这一点的最佳方法是什么?
发布于 2011-06-14 22:24:21
DELETE FROM table1 WHERE NOT EXISTS (SELECT * FROM details_table d WHERE d.table1_id = table1.id)
发布于 2011-06-14 22:41:41
下面是一个简单、可读、高效的查询,它将为您完成以下任务:
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
);发布于 2011-06-15 00:11:59
与使用IN()的子查询相比,我一直更喜欢联接:
http://dev.mysql.com/doc/refman/5.5/en/rewriting-subqueries.html
有时还有其他方法来测试一组值中的成员资格,而不是使用子查询。此外,在某些情况下,不仅可以在没有子查询的情况下重写查询,而且可以更有效地使用其中的一些技术,而不是使用子查询。其中之一是IN()构造。
..。
--
LEFT [OUTER] JOIN可以比等效的子查询更快,因为服务器可能能够更好地优化它--这并不是MySQL服务器特有的事实。在SQL92之前,外部联接并不存在,因此子查询是执行某些事情的唯一方法。今天,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
; https://stackoverflow.com/questions/6350826
复制相似问题