一、基本区别:
DROP:
DROP test;
删除表test,并释放空间,将test删除的一干二净。
TRUNCATE:
TRUNCATE test;
删除表test里的内容,并释放空间,但不删除表的定义,表的结构还在。
DELETE:
1、删除指定数据
删除表test中年龄等于30的且国家为US的数据
DELETE FROM test WHERE age=30 AND country='US';
2、删除整个表
仅删除表test内的所有内容,保留表的定义,不释放空间。
DELETE FROM test 或者 DELETE FROM test; DELETE * FROM test 或者 DELETE * FROM test;
二、详细讲解
truncate table 命令:
将快速删除数据表中的所有记录,但保留数据表结构。这种快速删除与 delete from 数据表的删除全部数据表记录不一样,delete 命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而 truncate 命令删除的数据是不可以恢复的。相同点truncate 和不带 where 子句的 delete, 以及 drop 都会删除表内的数据。不同点:1. truncate 和 delete 只删除数据不删除表的结构(定义) ,drop 语句将删除表的结构被依赖的约束(constrain), 触发器(trigger), 索引(index); 依赖于该表的存储过程/函数将保留, 但是变为 invalid 状态。2.delete 语句是 dml, 这个操作会放到 rollback segement 中, 事务提交之后才生效; 如果有相应的 trigger, 执行的时候将被触发。 truncate, drop 是 ddl, 操作立即生效, 原数据不放到 rollback segment 中, 不能回滚。 操作不触发 trigger。3.delete 语句不影响表所占用的 extent, 高水线(high watermark)保持原位置不动。 显然 drop 语句将表所占用的空间全部释放 。 truncate 语句缺省情况下见空间释放到 minextents 个 extent, 除非使用 reuse storage; truncate会将高水线复位(回到最开始)。4.速度:一般来说: drop > truncate > delete 。5.安全性: 小心使用 drop 和 truncate, 尤其没有备份的时候。否则哭都来不及。使用上, 想删除部分数据行用 delete, 注意带上 where 子句。 回滚段要足够大。想删除表, 当然用 drop。想保留表而将所有数据删除。如果和事务无关, 用 truncate 即可。 如果和事务有关, 或者想触发 trigger, 还是用 delete。如果是整理表内部的碎片, 可以用 truncate 跟上 reuse stroage, 再重新导入/插入数据。
相同点:drop、delete、truncate 都是删除表的内容。
不同点: delete:删除表的内容,表的结构还存在,不释放空间,可以回滚恢复;
drop:删除表内容和结构,释放空间,没有备份表之前要慎用;
truncate:删除表的内容,表的结构存在,可以释放空间,没有备份表之前要慎用;
执行速度:drop > truncate > delete
mysql 中可以通过参数 sql_safe_updates 来限制 update/delete,防止全表更新或删除。
以下 3 种情况在采用此参数的情况下都不能正常进行操作:
1: 没有加where条件的全表更新操作;
2: 加了 where 条件字段,但是 where 字段没有走索引的表更新;
3: 全表 delete 没有加 where 条件或者 where 条件没有走索引。
这三种情况下都会抛出异常,无法执行。
下面是 sql_safe_updates 变量为 0 和 1 时的取值说明:sql_safe_updates 有两个取值 0 和 1, 即
off 和 on。sql_safe_updates = 1 (或 sql_safe_updates = on ) 时,不带 where 和 limit 条件的
update 和 delete 操作语句是无法执行的,即使是有 where 和 limit 条件但不带 key column 限制条
件的 update 和 delete 也不能执行。sql_safe_updates = 0 (或 sql_safe_updates = off ) 时,无
where 和 limit 条件的 update 和 delete 操作将会顺利执行。很显然,在一般的 mysql 中此参数的
默认值是 1。在 sql_safe_updates = on 时,采取删除或更新全表时抛出的错误码为 1175。
安装模式设置:
set sql_safe_updates=1; // 安全模式打开状态
set sql_safe_updates=0; // 安全模式关闭状态
如果设置了 sql_safe_updates=1,那么 update 语句必须满足如下条件之一才能执行成功:
1) 使用 where 子句, 并且 where 子句中列必须为 prefix 索引列。
2) 使用 limit。
3) 同时使用 where 子句和 limit (此时 where 子句中列可以不是索引列)。
delete 语句必须满足如下条件之一才能执行成功。
1) 使用 where 子句, 并且 where 子句中列必须为 prefix 索引列。
2) 同时使用 where 子句和 limit (此时 where 子句中列可以不是索引列)。