我在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/