问题标签 [sql-delete]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
94 浏览

mysql - 改进 mysql 查询

我有一个查询。

基本上删除表 B、C 或 D 中未出现字段的 A 中的所有行i。如果只是:

然后可以通过左连接轻松完成

(假设每个表在模式中都有一个 id 字段)

我想我的问题是,以上是否通过以下解决方案扩展到三表场景?

0 投票
1 回答
4113 浏览

android - 删除 Android SQLite 数据库中的第一行

目前我的程序中有这段代码:

它工作正常,并删除指定的行。但是,我还想实现它,以便我可以删除数据库中最近(最早日期)的条目,该条目应该位于表的顶部。我知道我可以通过更改 delete 的最后 2 个参数来做到这一点,但我无法弄清楚将它们更改为什么。

0 投票
2 回答
920 浏览

mysql - mysql 在加入时删除?

我可以用

顶部选择匹配的行,

如何编写查询以删除双方的匹配行?

就像是

0 投票
3 回答
13334 浏览

sql - 删除许多行而不锁定它们

在 PostgreSQL 中,我有一个如下查询,它将从 1m 行表中删除 250k 行:

该查询需要一个多小时才能执行,在此期间,受影响的行被锁定以进行写入。这不好,因为这意味着许多更新查询必须等待大删除查询完成(然后它们将失败,因为行从它们下面消失了,但这没关系)。我需要一种方法将这个大查询分割成多个部分,以便它们对更新查询造成尽可能小的干扰。例如,如果删除查询可以被分成块,每个块有 1000 行,那么其他更新查询最多必须等待涉及 1000 行的删除查询。

该查询可以很好地工作,但可惜它在 postgres 中不存在。

0 投票
9 回答
25446 浏览

sql - 删除具有 4200 万行表的相关子查询的 SQL?

我有一张cats有 42,795,120 行的表。

显然这是很多行。所以当我这样做时:

查询超时:(

(编辑:我需要增加我的 CommandTimeout 值,默认只有 30 秒)

我不能使用TRUNCATE TABLE cats,因为我不想从其他主人那里吹走猫。

我正在使用 SQL Server 2005,并将“恢复模型”设置为“简单”。

所以,我想过做这样的事情(顺便说一句,从应用程序执行这个 SQL):

我的问题是:我可以DELETE在 SQL Server 2005 中的行数阈值是多少?

或者,如果我的方法不是最优的,请提出更好的方法。谢谢。

这篇文章对我的帮助不够:

编辑(2010 年 8 月 6 日):

好的,我在再次阅读上面的链接后才意识到我在这些表上没有索引。此外,你们中的一些人已经在下面的评论中指出了这个问题。请记住,这是一个虚构的模式,所以甚至id_cat不是 PK,因为在我的现实生活模式中,它不是一个独特的领域。

我将索引放在:

  1. cats.id_cat
  2. owner_cats.id_cat
  3. owner_cats.id_owner

我想我还在掌握这个数据仓库的窍门,显然我需要所有JOIN字段的索引,对吧?

但是,我需要几个小时才能完成这个批量加载过程。我已经在这样做了SqlBulkCopy(以块的形式,而不是一次全部 4200 万)。我有一些索引和 PK。我阅读了以下帖子,这些帖子证实了我的理论,即即使是批量复制,索引也会减慢速度:

所以我会DROP在复制之前访问我的索引,然后CREATE在完成后重新搜索它们。

由于加载时间长,我需要一段时间来测试这些建议。我会报告结果。

更新(2010 年 8 月 7 日):

汤姆建议:

仍然没有索引,对于 4200 万行,它需要 13:21 分:秒,而上述方式需要 22:08。然而,对于 1300 万行,他用了 2:13 而不是我的老方法 2:10。这是一个好主意,但我仍然需要使用索引!

更新(2010 年 8 月 8 日):

有什么大错特错!现在打开索引,我上面的第一个删除查询花费了 1:9 hrs:min (是的一个小时!)与 22:08 min:sec 和 13:21 min:sec 相比 2:10 min:sec 用于 42 百万行和分别为 13 百万行。我现在要尝试使用索引进行 Tom 的查询,但这是朝着错误的方向发展。请帮忙。

更新(2010 年 8 月 9 日):

Tom 的删除需要 1:06 小时:分钟(42 百万行)和 10:50 分钟:秒(13 百万行),而索引分别为 13:21 分钟:秒和 2:13 分钟:秒。 当我使用一个数量级的索引时,删除在我的数据库上花费的时间更长! 我想我知道为什么,我的数据库 .mdf 和 .ldf 在第一次(4200 万)删除期间从 3.5 GB 增长到 40.6 GB! 我究竟做错了什么?

更新(2010 年 8 月 10 日):

由于缺乏任何其他选择,我想出了一个我觉得乏善可陈的解决方案(希望是暂时的)

  1. 将数据库连接超时时间增加到 1 小时(CommandTimeout=60000;默认为 30 秒)
  2. 使用 Tom 的查询:DELETE FROM WHERE EXISTS (SELECT 1 ...)因为它执行得快一点
  3. DROP运行删除语句之前的所有索引和 PK (???)
  4. 运行DELETE语句
  5. CREATE所有索引和 PK

似乎很疯狂,但至少它比TRUNCATE从 first 开始使用和重新开始我的负载要快owner_id,因为我的一个owner_id需要 2:30 hrs:min 来加载,而我刚刚描述的删除过程需要 17:22 min:sec 42 百万行。(注意:如果我的加载过程抛出异常,我会重新开始owner_id,但我不想吹走之前的owner_id,所以我不想上桌,这就是我尝试使用的原因。)TRUNCATEowner_catsDELETE

任何帮助仍将不胜感激:)

0 投票
5 回答
21294 浏览

sql - SQL Server DELETE 使用索引较慢

我有一个 SQL Server 2005 数据库,我尝试在适当的字段上放置索引,以加快DELETE数百万行(big_table只有 3 列)表中记录的速度,但现在DELETE执行时间更长!(例如 1 小时对 13 分钟)

我在表之间有关系,我过滤的列DELETE在另一个表中。例如

顺便说一句,我也试过:

虽然它似乎比第一个运行得稍快,但使用索引仍然比没有索引慢很多。

我在这些字段上创建了索引:

  1. big_table.id_product
  2. small_table.id_product
  3. small_table.id_category

我的 .ldf 文件在DELETE.

DELETE当我的表上有索引时,为什么我的查询会变慢? 我以为他们应该跑得更快。

更新

好的,共识似乎是索引将大大减慢,DELETE因为必须更新索引。虽然,我仍然不明白为什么它不能DELETE一次所有的行,而只是在最后更新一次索引。

我从我的一些阅读中得到的印象是,DELETE通过更快地搜索WHERE子句中的字段,索引会加快速度。

Odetocode.com 说:

“在 DELETE 和 UPDATE 命令中搜索记录时,索引的工作方式与在 SELECT 语句中一样。”

但在文章后面,它说过多的索引会损害性能。

鲍勃问题的答案:

  1. 表中有 5500 万行
  2. 4200 万行被删除
  3. 类似SELECT的语句不会运行(抛出了“System.OutOfMemoryException”类型的异常)

我尝试了以下 2 个查询:

运行25 分钟后两者均失败,并出现来自 SQL Server 2005 的以下错误消息:

数据库服务器是具有 7.5 GB 内存的较旧的双核 Xeon 机器。这是我的玩具测试数据库:) 所以它没有运行其他任何东西。

我需要对我的索引做一些特殊的事情CREATE以使它们正常工作吗?

0 投票
3 回答
61001 浏览

java - 休眠并删除所有

在 Hibernate 中删除表中所有行的最佳方法是什么?

如果我遍历一个集合并称它为session.delete()我所知的不执行。

如果我使用另一个选项session.createQuery("delete ..."),它不会影响持久性上下文。

如果没有更好的变体,我什么时候应该使用这些方法?

0 投票
3 回答
166 浏览

mysql - DELETE JOIN 的问题

给出错误:#1064 - 您的 SQL 语法有错误;

用 SELECT 替换 DELETE 它工作正常

0 投票
4 回答
119 浏览

sql - I have an SQL delete query

There are 2 tables: report (which has a primary key of reportId and a bit field called migrated) and report_detail (which has a foreign key of reportId). I want to delete all the rows from report_detail that have a reportId which, in the report table, has migrated = 1. This is the select query that selects all the rows I want:

Will this delete query do what I want or am I doing something wrong?

0 投票
4 回答
35296 浏览

mysql - 根据最大值删除一行

如何构造一个 mySQL 查询以根据最大值删除一行。

我试过

但有错误?