首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除查询删除没有约束的条目

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

Stack Overflow用户
提问于 2011-06-14 22:18:31
回答 3查看 565关注 0票数 1

我有一个表,比如table1,有50条记录,表1的记录与其他使用约束的子表捆绑在一起。

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

我尝试了delete ignore声明:

代码语言:javascript
复制
delete ignore from table1;

但这并没有帮助&我得到了一个错误:

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

在mysql查询中实现这一点的最佳方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2011-06-14 22:24:21

DELETE FROM table1 WHERE NOT EXISTS (SELECT * FROM details_table d WHERE d.table1_id = table1.id)

票数 0
EN

Stack Overflow用户

发布于 2011-06-14 22:41:41

下面是一个简单、可读、高效的查询,它将为您完成以下任务:

代码语言:javascript
复制
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
);
票数 0
EN

Stack Overflow用户

发布于 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回答您的问题

代码语言:javascript
复制
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
; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6350826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档