删除查询以删除没有约束的条目

时间:2011-06-14 22:18:31

标签: mysql

我有一个表,表示table1有50条记录,table1的记录与其他子表使用约束绑定。

并非所有50条记录都有约束,可能没有约束的记录很少(比如15条),所以我想运行一个删除查询,在总共50条记录中单独删除15个条目。

我尝试了delete ignore声明:

delete ignore from table1;

但它没有帮助&我收到了这个错误:

  

无法删除或更新父行:   外键约束失败

在mysql查询中实现此目的的最佳方法是什么?

3 个答案:

答案 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
;