对截断语句的标准定义感到困惑
Posted
技术标签:
【中文标题】对截断语句的标准定义感到困惑【英文标题】:Confused with Standard definition of Truncate statement 【发布时间】:2016-10-31 15:35:56 【问题描述】:我在使用 MSSQL 服务器方面有相当多的经验。我们有一个从 mysql 到 SQL 服务器的数据库迁移。我从来没有使用过 MYSQL,所以我在使用这个 link 时遇到了差异。
在页面的某处,下面是Truncate的定义..
SQL 标准将 TRUNCATE TABLE 表名语句(可选功能 ID F200,SQL:2008 中的新功能)定义为: 删除基表的所有行而不引起任何触发操作。
不幸的是,标准没有指定 1. 在涉及其他语句的事务中是否应该允许TRUNCATE TABLE 2. TRUNCATE TABLE 是否应该暗示立即提交
对于 SQL 服务器,页面显示
遵循标准。
在 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 是否应该暗示立即提交,或者不
【问题讨论】:
只是为了让您了解 truncate table 它的 DDL 查询删除和重新创建表(不删除数据)。它直接删除表并重新创建它。你不能在事务块中执行 DDL 查看 Devart 的 pageTRUNCATE
表格和 Safari 的 manual。差异取决于您正在处理的表的类型。 InnoDB
表是基于 ACID 的,但在任何一种情况下,TRUNCATE
都不是事务安全的,并且不会触发 DELETE
触发器。老实说,TRUNCATE
是在您不关心数据时使用的。DELETE
是商业友好的,以防发生错误或恶意事件。
【参考方案1】:
感谢来自 Clifton_h 的链接和对此question 的回答...
我的问题是这个措辞是什么意思
TRUNCATE TABLE 是否应该暗示立即提交
这一切都归结为您是否可以回滚截断..
对于 MYSQL 和 Oracle: 您不能回滚截断,因为那些 DBMS 确实在事务后应用隐式提交,并且只有在出现错误的情况下才会回滚,但用户不能这样做
对于 SQL 服务器: 您可以回滚截断,因为不应用立即提交..
【讨论】:
以上是关于对截断语句的标准定义感到困惑的主要内容,如果未能解决你的问题,请参考以下文章