TRUNCATE是DML语句吗?

时间:2010-08-30 06:12:05

标签: sql database postgresql sql-standards

我们可以归类/说TRUNCATE属于/属于DML语句吗?

检查here以了解PostgreSQL TRUNCATE兼容性。

注意:TRUNCATE是SQL标准ANSI SQL 2008 - F200

的一部分

3 个答案:

答案 0 :(得分:3)

的PostgreSQL

我想说它是PostgreSQL中的DML语句:PostgreSQL有TRUNCATE trigger但PostgreSQL没有DDL触发器。所以它不能是DDL声明。

它在每个运行的表上获取一个ACCESS EXCLUSIVE锁,它不是MVCC安全的,但它是事务安全的,你可以做回滚。

  

触发触发器的能力   TRUNCATE是PostgreSQL的扩展   SQL标准。

答案 1 :(得分:3)

由于TRUNCATE 操纵数据并且不更改任何定义,我清楚地将其视为DML语句。

答案 2 :(得分:1)

的Oracle

删除执行普通DML。也就是说,它们对行进行锁定,它们生成重做(大量的),并且它们需要UNDO表空间中的段。仔细删除块中的清晰记录。如果出现错误,则可以发出回滚以在提交之前恢复记录。删除不会放弃段空间,因此删除了所有记录的表会保留所有原始块。

截断是DDL,从某种意义上说,是作弊。截断物将表格的高水位标记移回零。不进行行级锁定,不会生成重做或回滚。初始化的所有范围都从表中取消分配(如果将MINEXTENTS设置为除1之外的任何值,则保留该数量的范围而不是仅保留初始范围)。通过重新定位高水位线,它们可以防止读取任何表格数据,因此它们具有与删除相同的效果,但没有所有开销。只是一个小问题:截断是一个DDL命令,所以如果你决定犯了错误,你就不能回滚它。 (当然,你也可以选择性地截断-no" WHERE"子句,这与删除不同,当然也是如此)。

通过重置高水位标记,truncate可以防止读取任何表格的数据,因此它们与删除具有相同的效果,但没有开销。但是,必须牢记一个截断的一个方面。因为Truncate是DDL,它会在它执行之前发出一个COMMIT,然后在另一个COMMIT之后发出,所以不能回滚该事务。

请注意,默认情况下,即使未指定DROP STORAGE,TRUNCATE也会删除存储空间。

版本11.1,10.2,10.1和9.2的Oracle数据库SQL参考文档都指出" DROP STORAGE"是TRUNCATE的默认选项。那就是:

" DROP STORAGE:指定DROP STORAGE从表或集群中删除已删除行的所有空间,但表或集群的MINEXTENTS参数分配的空间除外。随后,该空间可以由表空间中的其他对象使用。 Oracle还将NEXT存储参数设置为截断过程中从段中删除的最后一个范围的大小。这是默认值。"