SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别

一、基本区别:

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 子句中列可以不是索引列)。

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 删除操作是指从表中移除行。而drop操作指的是删除整个表或某列,而truncate操作指的是将表中所有行删除,但表结构保留。 删除操作会永久删除数据,而丢弃和截断操作则只是临时地删除数据,可以通过恢复操作进行恢复。deletedroptruncate 都是用来删除数据的 SQL 命令,但它们的作用略有不同。 1. delete 用于删除表中的部分数据,可以带有 WHERE 子句指定删除的条件。例如: DELETE FROM table_name WHERE condition; 上述语句删除表 table_name 中符合条件 condition 的数据行。 2. drop 用于删除整张表,包括表结构和表中的所有数据。例如: DROP TABLE table_name; 上述语句删除名为 table_name 的表。 3. truncate 也是用于删除整张表的数据,但与 drop 不同的是,它只删除数据,不删除表结构。例如: TRUNCATE TABLE table_name; 上述语句删除表 table_name 中的所有数据,但保留表结构。 需要注意的是,使用 drop 命令删除表时要谨慎,因为一旦删除就无法恢复,而使用 truncate 命令只能删除表中的数据,不能恢复已删除的数据。因此,在删除数据时,应该根据实际情况选择合适的命令。 ### 回答2: deletedroptruncate都是用于删除数据库中的表或数据的SQL命令,但它们之间有一些重要的区别。 1. deletedelete命令是用来删除表中的记录,可以根据条件来删除指定的行。它是一条DML(数据操作语言)命令,即数据操作语言,因此可以在事务中使用,并且可以回滚。使用delete命令删除的数据可以通过rollback进行回滚操作,恢复到删除之前的状态。 2. dropdrop命令用于删除整个表结构,包括表的定义、索引和触发器等。它是一条DDL(数据定义语言)命令,即数据定义语言,因此不能在事务中执行,也不可以回滚。使用drop命令删除表后,表的结构以及其中的所有数据、索引和触发器都将永久删除,不能恢复。 3. truncatetruncate命令也是用来删除表中的数据,但与delete不同的是,truncate命令是将表中的所有记录都删除,并且释放占用的空间。它是一种DDL命令,因此也不能在事务中执行,也不可以回滚。与delete命令相比,truncate命令执行的速度更快,因为它并不将被删除的数据存储在事务日志中,也不会触发触发器。使用truncate命令删除的数据无法通过rollback进行回滚操作,而且无法恢复被删除的数据。 综上所述,delete适用于删除指定的数据行,并可以在事务中回滚操作;drop适用于删除整个表结构,且无法回滚恢复;truncate适用于删除表中的所有数据,速度更快,但也无法回滚恢复。根据实际需求和情况选择合适的删除方式。 ### 回答3: deletedroptruncate数据库操作中3个不同的命令,用于删除表中的数据或删除整个表。它们的区别如下: 1. delete: delete命令用于从表中删除指定的行或根据条件删除记录。它会激活触发器,将删除的行放入事务日志中,并可以回滚删除操作。delete命令属于DML(数据操作语言)命令。 2. drop: drop命令用于删除整个表,包括表的定义、结构和所有数据。执行drop命令后,表的结构和数据将完全丢失,不可恢复。可以通过备份来恢复表。drop命令不会触发触发器,也不会将删除操作记录在事务日志中。drop命令属于DDL(数据定义语言)命令。 3. truncate: truncate命令用于删除表中的所有数据,但保留表的定义和结构。执行truncate操作后,表的数据将被清空,但表的结构和权限保持不变。与drop命令不同,truncate命令可以恢复,即可使用rollback语句回滚操作。truncate命令不会触发触发器,也不会将删除操作记录在事务日志中。truncate命令属于DDL命令。 总结来说,delete是用于删除表中指定行或满足条件的记录,drop是用来删除整个表,而truncate删除表中的所有数据但保留表的定义和结构。每个命令在使用时需要谨慎,确保不会误操作导致数据丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值