DROP 和 TRUNCATE 的区别

use*_*823 8 mysql truncate drop-table

什么是TRUNCATE做不同的下降?

我相信它会删除表中的所有数据,但将表名保留在数据库中,而 asDROP会删除所有数据和表。这样对吗 ?

Mik*_*Fal 22

删除 - 数据操作语言(DML)

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

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

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

TRUCNATE被视为DDL语句,这意味着它旨在改变对象在数据库中的定义方式。通常,DDL 语句是CREATEALTER、 或DROP,但TRUNCATE服务于特定目的,即通过删除所有行来“重置”表。这种方法在 RDBMS 引擎之间有所不同,我建议查看MySQL细节。a 的实际含义TRUNCATE是:

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

删除表 - 数据定义语言(DDL)

DROP TABLE比 a 更进一步TRUNCATE,它实际上从数据库中完全删除了表。这包括删除所有关联的对象,例如索引和约束。如果删除表,不仅会删除所有数据,还会删除结构。这通常会在不再需要表时完成。主要的问题是,由于 aDROP是 DDL,您通常无法撤消它。某些 RDBMS 引擎允许您将 DDL 包装在事务中,以便您可以回滚它,但这不是最佳实践,应该避免。


Mol*_*yOQ 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                            |  
Run Code Online (Sandbox Code Playgroud)

本书资料整理:http : //amzn.com/0470395125

希望这可以帮助像我一样偶然发现此页面的任何 Oracle 用户。请随时指出这些要点中的哪一点(如果有的话)在 MySQL 中是正确的,


小智 2

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

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