对截断语句的标准定义感到困惑

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 的 page TRUNCATE 表格和 Safari 的 manual。差异取决于您正在处理的表的类型。 InnoDB 表是基于 ACID 的,但在任何一种情况下,TRUNCATE 都不是事务安全的,并且不会触发 DELETE 触发器。老实说,TRUNCATE 是在您不关心数据时使用的。DELETE 是商业友好的,以防发生错误或恶意事件。 【参考方案1】:

感谢来自 Clifton_h 的链接和对此question 的回答...

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

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

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

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

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

【讨论】:

以上是关于对截断语句的标准定义感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对mysql代码何时使用PDO进行注入证明感到困惑

标准 Jpa 选择外国实体

一条SQL语句的千回百转

对 Apache Shiro 和自定义授权领域感到困惑

“if”语句的安全性如何?

SQL sever 中的警告“将截断字符串或二进制数据 语句已终止” 是啥意思啊? 我是刚学这个的?懂的帮帮我