我在MSSQL Server方面有相当丰富的经验。我们有从MYSQL到SQL Server的数据库迁移。我从未使用过MYSQL,因此我在使用link时遇到了一些麻烦。

在页面上的一个地方,以下是“截断”的定义。


  SQL标准将TRUNCATE TABLE表名语句(可选功能ID F200,SQL:2008中的新增功能)定义为:
  删除基本表的所有行,而不引起任何触发的动作。
  
  不幸的是,该标准未指定
  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 Server如何遵循标准而MYSQL不是。


  TRUNCATE TABLE是否应​​暗示立即提交

最佳答案

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

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


  TRUNCATE TABLE是否应​​暗示立即提交


这一切都归结为您是否可以回滚截断。

对于MYSQL和Oracle:
您不能回滚截断,因为那些DBMS确实在事务之后应用了隐式提交,并且仅在发生错误的情况下才回滚,但是用户不能这样做

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

关于mysql - 与截断语句的标准定义混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38090931/

10-12 20:11