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 无法激活触发器,因为该操作不记录单个行删除。
性能更快,因为它不保留任何日志。
可以回滚。
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中截断与删除的比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章
迁移警告 - 列 x 到 x 的截断键列长度 - SQL Server 到 MYSQL 迁移