对Truncate语句

时间:2016-06-29 05:20:07

标签: mysql sql-server database-migration

我对MSSQL服务器有相当多的经验。我们有从MYSQL到SQL服务器的数据库迁移。我从未使用过MYSQL,所以我使用这个link来解决差异。

在页面的一个位置,下面是Truncate的定义..

  

SQL标准将TRUNCATE TABLE tablename语句(可选功能ID F200,SQL:2008中的new)定义为:   删除基表的所有行而不会导致任何触发操作。

     

不幸的是,该标准没有指明
  1.是否应该在涉及其他陈述的交易中允许TRUNCATE TABLE    2. TRUNCATE TABLE是否应​​该意味着立即执行COMMIT,而不是

对于SQL Server,页面显示

  

遵循标准。

     

在MSSQL中,在涉及其他操作的事务中允许TRUNCATE TABLE,而TRUNCATE TABLE并不意味着立即执行COMMIT操作。

对于MYSQL,该页面显示

  

MySQL有一个TRUNCATE TABLE语句,但它并不总是遵循标准。

     

请注意,在某些情况下,MySQL的truncate命令实际上等同于无限制的DELETE命令(即:可能缓慢且触发器调用)。它的行为取决于表管理的存储引擎。

     

使用InnoDB(事务安全)表时,在涉及其他操作的事务中允许TRUNCATE TABLE,但TRUNCATE TABLE意味着立即执行COMMIT操作。

在SQLServer中,截断表时 1.操作可能是最少记录的 2.仅发生页面解除分配并记录在事务日志中

所以我的问题是:
1.标准中的措辞如何以及SQL服务器如何遵循标准和MYSQL不是。

  

TRUNCATE TABLE是否应​​该意味着立即执行COMMIT,而不是

1 个答案:

答案 0 :(得分:0)

感谢Clifton_h的链接以及此question的答案......

我的问题是这个措辞是什么意思

  

TRUNCATE TABLE是否应​​该意味着立即执行COMMIT,而不是

这一切都归结为你是否可以回滚截断..

对于MYSQL和Oracle:
你不能回滚截断,因为那些DBMS在事务之后确实应用了隐式提交,只有在出现错误时才会回滚,但是用户不能这样做

对于SQL Server:
您可以回滚截断,因为不会应用立即提交..