mysql / sqlserver中截断与删除的比较[重复]

Posted

技术标签:

【中文标题】mysql / sqlserver中截断与删除的比较[重复]【英文标题】:comparison of truncate vs delete in mysql/sqlserver [duplicate] 【发布时间】:2013-12-31 19:57:42 【问题描述】:

关于 mysql/sqlserver 的一件事让我印象深刻,即 delete/truncate

哪个更好更快?

在哪里使用删除?

在哪里使用截断?

【问题讨论】:

see here 在网上找到这篇文章有更多解释:dotnetmob.com/delete-vs-truncate-sql-server @ShamseerKSmr 页面未找到,这就是为什么最好避免在没有解释的情况下发布链接。 @iloo 更新链接dotnetmob.com/sql-server-article/… 【参考方案1】:

区别:

    Truncate 删除表中的完整数据,下一个自动递增 id 将从 1 开始,而Delete 将从下一个 id 开始。 两者都将保持结构完整并仅删除数据。 Delete 可以使用 limit,而Truncate 则不能。

【讨论】:

【参考方案2】:

删除

    DELETE 是一个 DML 命令。 DELETE 语句使用行锁执行,表中的每一行都被锁定以进行删除。 我们可以在 where 子句中指定过滤器 如果条件存在则删除指定的数据。 删除会激活触发器,因为操作是单独记录的。 比截断慢,因为它保留了日志。 可以回滚。

截断

    TRUNCATE 是一个 DDL 命令。 TRUNCATE TABLE 始终锁定表和页,而不是每一行。 不能使用 Where 条件。 它会删除所有数据。 TRUNCATE TABLE 无法激活触发器,因为该操作不记录单个行删除。 性能更快,因为它不保留任何日志。 可以回滚。

DELETE 和 TRUNCATE 在与 TRANSACTION(TRUNCATE 可以在 SQL Server 中回滚,但不能在 MySQL 中)。 如果有一个自动递增的 PK,截断将 重置计数器

http://beginner-sql-tutorial.com/sql-delete-statement.htm

【讨论】:

+1 以获得详细的解释和清晰的格式 Truncate 也会将自增值更改为 1。删除不会保留现有的自增值 @Onimusha,此点已在最后一行中指定“如果有自动递增的 PK,则截断将重置计数器” TRUNCATE 不能回滚! dev.mysql.com/doc/refman/5.6/en/truncate-table.html @bgs 好吧,我们还是那样。答案可能应该增加上下文,并强调 TRUNCATE 中 MySQL 和 SQL Server 之间的差异。【参考方案3】:

DELETE 命令用于从表中删除行

TRUNCATE 删除表中的所有行。该操作无法回滚,也不会触发任何触发器。因此,TRUNCATE 速度更快,并且不像DELETE 使用那么多的撤消空间。

【讨论】:

【参考方案4】:

区别

最重要的区别是 DELETE 操作是事务安全和记录的,这意味着 DELETE 可以回滚。 TRUNCATE 不能在事务内部完成,也不能回滚。因为没有记录 TRUNCATE,所以恢复被错误地截断的表比从 DELETE 中恢复要大得多。

如果外键约束被破坏,DELETE 将失败; TRUNCATE 可能不遵守外键约束(它适用于 InnoDB 表)。 DELETE 将触发任何 ON DELETE 触发器; TRUNCATE 不会。

更快

截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。

在哪里使用

截断

当表设置为空时,需要将自增键重置为 1。 它比 DELETE 快,因为它会删除所有数据。 DELETE 将扫描表以生成受影响的行数。

删除

需要根据可选的 WHERE 子句删除行。 需要日志并应用外键约束

【讨论】:

以上是关于mysql / sqlserver中截断与删除的比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中,删除似乎正在截断整个表

由于截断/删除导致 SQL Server 主键冲突?

在 SQL Server 2005 中截断数据库的所有表

迁移警告 - 列 x 到 x 的截断键列长度 - SQL Server 到 MYSQL 迁移

MSSQL:仿写MYSQL的substring_index 截断函数 F_SUBSTRING_INDEX

批量删除(截断与删除)