MySQL 知识 -- drop、delete 和 truncate 的区别

本文最后更新于:5 天前

drop

直接删除表

truncate

直接删除表的数据

delete

删除表的数据,可以添加 where 字句

区别

  1. 删除效果不同。

    1. delete 是一行行删除表的数据

    2. truncate 是一次性从表中删除所有的数据,删除时不会激活与表有关的触发器

    3. drop 不仅删除数据也会删除表结构,删除时,相关的约束、触发器、索引、存储过程会被保留,但是状态会变为 invalid

  2. 应用范围不同。

    1. truncate 只能使用于 table ,而 delete 和 drop 可以用于 table 和 view

    2. 对于由 FOREIGN KEY 约束引用的表,不能使用 truncate,而应使用不带 where 子句的 delete 语句。

  3. 所属级别不同。

    1. delete 语句为 DML(Data Manipulation Language,数据操作语言,是对如和操作某些数据而言的),操作会被放到 rollback segment 中,事务提交才生效,如果有触发器 trigger 也会被触发。

      删除时,同时将该行的删除操作作为事务,记录在日志中保存,可以回滚

    2. truncate 和 drop 都是 DLL(Data Define Language,数据定义语言,是对数据库和数据表的定义而言的),

      删除时,不会把删除操作记录记入日志保存,删除不可通过回滚恢复

  4. 删除速度不同

    一般来说 drop > truncate > delete

  5. 自增标识。

    truncate 新行标识所用的计数值重置为该列的种子。delete 则会保留原有的标识计数值。