【问题标题】:delete all from table从表中删除所有
【发布时间】:2011-03-01 08:44:45
【问题描述】:

什么更快?

DELETE FROM table_name;

DELETE FROM table_name where 1=1;

为什么?

truncate table 在访问中工作吗?

【问题讨论】:

  • 对于什么数据库?适合什么表?对于什么大小的数据?
  • 测量两者所用时间时发现了什么?
  • 嗯,只有我一个人注意到使用 DELETE * FROM 而不是 DELETE FROM 是错误的吗?我发现有人不小心把它放在代码中,并正在寻找它有多普遍。我还做了一个测试表,果然,没有星号。
  • 对于 MS-Access,DELETE * FROM 是正确的。这个问题一团糟,因为它已经为[mysql]和[ms-access]都积累了答案。

标签: sql mysql ms-access optimization performance


【解决方案1】:

您可以使用以下查询从表中删除所有行,还应记住它也会重置标识。

TRUNCATE TABLE table_name

【讨论】:

  • 不,如果您在原始问题中提到 Access 会有所帮助。在这种情况下,DELETE FROM table_name 将按照下面的回答最快地完成这项工作。
  • 请记住,TRUNCATE 将重置 MySQL 表上的所有 AUTO_INCREMENT 计数(不确定 MS Access 是否有这样的事情)。
  • Access 不维护事务日志,这就是不需要 TRUNCATE 语句的原因,也是 DELETE FROM table_name 可以很好地完成工作的原因。
  • 需要注意的是,DELETE 和 TRUNCATE 不是一回事。 TRUNCATE 有副作用,通常需要更多权限才能执行。
【解决方案2】:

这应该更快:

DELETE * FROM table_name;

因为 RDBMS 不必看where 是什么。

truncate 应该没问题:

truncate table table_name

【讨论】:

  • 不,Access 不支持。
  • Jet 将 DELETE * FROM Table 视为截断,而不是一一删除记录。不过,我认为它不会重置自动编号种子值。这必须在代码中或使用紧凑型来完成(甚至不确定它是否会在最近的 Jet/ACE 迭代中使用紧凑型重置)。
  • 我可以确认,如果从 Access 表中删除所有记录,Compact 将重置 Access 2016 中的自动编号种子值。
【解决方案3】:

这是删除表table_name

换成表名,要删除。

DELETE FROM table_name;

【讨论】:

  • 这不会删除表,它会删除表中的所有行并允许您继续使用不受影响的表。这对我来说是完美的,谢谢。
【解决方案4】:

有一个 2004 年的 mySQL bug report 似乎仍然有效。 似乎在 4.x 中,这是最快的:

DROP table_name
CREATE TABLE table_name

当时TRUNCATE table_name 在内部是DELETE FROM,没有提供任何性能提升。

这似乎已经改变,但仅在 5.0.3 和更年轻的版本中。来自错误报告:

[2005 年 1 月 11 日 16:10] Marko Mäkelä

我现在已经实现了快速 TRUNCATE TABLE,它有望包含在 MySQL 5.0.3 中。

【讨论】:

    【解决方案5】:
    TRUNCATE TABLE table_name
    

    是一种DDL(Data Definition Language),可以删除所有数据,清除身份。 如果你想使用这个,你需要在 table 中拥有 DDL 权限。

    DDL 语句示例:CREATE、ALTER、DROP、TRUNCATE 等

    DELETE FROM table_name / DELETE FROM table_name WHERE 1=1 (is the same)
    

    是一种DML(Data Manipulation Language),可以删除所有数据。 DML 语句示例:SELECT、UPDATE 等

    了解这一点很重要,因为如果应用程序在服务器上运行,那么当我们运行 DML 时不会有任何问题。但有时在使用 DDL 时,我们将不得不重新启动应用程序服务。我在 postgresql 有过这种经验。

    问候。

    【讨论】:

      【解决方案6】:

      你也可以使用截断。

      truncate table table_name;
      

      【讨论】:

      • 在您发布此答案七年前,此解决方案至少包含在三个答案中。请花时间阅读所有现有答案,然后再发布您的内容。
      猜你喜欢
      • 2013-04-24
      • 2014-07-11
      • 1970-01-01
      • 2012-04-26
      • 2012-03-15
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多