DROP和TRUNCATE之间的区别


Answers:


22

删除-数据处理语言(DML)

DELETE任何RDBMS中的语句都被视为DML语句。这种语句也称为CRUD(创建,读取,更新,删除),旨在在不影响对象基础结构的情况下操作数据库中的数据。实际上,这意味着:

  • 一个DELETE语句可以通过或者使用谓词微调WHEREJOIN删除表中的部分或全部行。
  • 一个DELETE语句将被数据库记录,如果该语句失败,可以在事务内被回滚。
  • 通常,a DELETE将对要删除的数据进行行级锁定,尽管可以根据需要将其升级为更高级别。
  • 由于事务的开销,它DELETE可以是“慢的”(这是相对的),但由于它的粒度细,所以更安全。

截断-数据定义语言(DDL)

TRUCNATE被认为是DDL语句,这意味着它旨在更改数据库中对象的定义方式。通常,DDL语句是CREATEALTERDROP,但TRUNCATE具有特定的目的,即通过删除所有行来“重置”表。在RDBMS引擎之间,此方法有所不同,我建议您查看MySQL的详细信息。a的实际含义TRUNCATE是:

  • TRUNCATE不能细颗粒。如果成功,它将从表中删除所有行。
  • TRUNCATE通常不记录。这取决于RDBMS,我建议您更具体地了解MySQL如何处理它。(提示,因版本而异。)
  • TRUNCATE需要表元数据锁才能执行。实际实现的方式可能特定于RDBMS,但是从本质上讲,该TRUNCATE过程必须防止其他进程破坏表以执行其DDL。
  • 因为(通常)未记录日志并且不使用谓词,所以a TRUNCATE会比a快DELETE,但安全性较低。

拖放表-数据定义语言(DDL)

DROP TABLETRUNCATE它比a更进一步,因为它实际上从数据库中完全删除了表。这包括删除所有关联的对象,例如索引和约束。如果删除了表,则不仅要删除所有数据,还要删除结构。通常将在不再需要表时执行此操作。首先要考虑的是,由于a DROP是DDL,因此通常无法撤消它。一些RDBMS引擎将允许您将DDL包装在事务中,以便可以将其回滚,但这不是最佳实践,应避免。


1
我将添加TRUNCATE重置表的自动增量计数器。
DanMan 2014年

5

尽管我不能代表MySQL,但这是一张快速表格,比较了Oracle中截断和删除的某些方面。

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

本书汇编的信息:http : //amzn.com/0470395125

希望这可以像我一样帮助任何偶然浏览此页面的Oracle用户。请随时指出以下几点在MySQL中是否正确,


2

DROP TABLE TableName ->从数据库中删除表。

TRUNCATE TABLE TableName->删除表的数据,无条件...并重置IDENTITY种子值(如果表具有IDENTITY字段)。


1
  • DELETE:DML命令,如果执行delete命令,则在不更改表结构的情况下删除唯一的DATA结构,我们可以逐行方式回滚数据

  • TRUNCATE:DDL命令,如果执行Truncate命令,则在不更改表结构的情况下删除唯一的数据,因此我们无法回滚数据truncate,以PAGE BY PAGE的方式删除数据,truncate更快,然后删除查询

  • DROP:,DDL命令,如果执行DROP命令,其删除(删除)数据和总表结构,我们也无法回滚数据

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.