Truncate table,Delete table,与Drop table的区别

本文通过生动的比喻解释了数据库操作中Delete、Truncate和Drop的区别。Delete用于逐条删除记录并可回滚;Truncate清空数据不可恢复且不触发删除触发器;Drop则完全删除表及数据。

前几天在群中见到有人问drop table和truncate table之间有什么区别,三思是这样回答的:就像吃鸡和吃鸡蛋的区别一样~

鸡蛋吃掉了没关系,只要鸡还在,蛋就还有再下的可能,不过如果鸡被吃掉了,那就连鸡带蛋都没啦~~

对应到drop table和truncate table也是这样理解。

truncate table就像是吃蛋,数据是没了,但表还在,只要你愿意,还可以再往里填数据。

drop table就像吃鸡,不仅数据没了,连表都没了。

 

 

 

truncate做的修改是不能回滚的,就是不可恢复的操作。用了这个命令后就收回了表空间。delete删除是要把数据写入系统回滚段中以便恢复时使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

网站地址:

http://space.itpub.net/7607759/viewspace-524741

 

 

http://gaijing814.iteye.com/blog/403243

 

 

 

http://www.blogjava.net/parable-myth/archive/2008/09/04/226979.html

 

 

******************************************************下面加一点总结

 

delete还会触发delete触发器,当然如果有的话。

在 MySQL 中,`TRUNCATE TABLE` 和 `DELETE FROM` 都用于删除表中的数据,但它们在多个方面存在区别: - **语法**:`TRUNCATE TABLE` 的语法为 `TRUNCATE TABLE table_name`;`DELETE FROM` 的语法为 `DELETE FROM table_name [WHERE]` [^1]。 - **删除方式**:`TRUNCATE TABLE` 是删除并重建表;`DELETE FROM` 是逐行删除 [^1]。 - **速度**:`TRUNCATE TABLE` 更快,因为它直接删除整个数据块,而不是逐行删除;`DELETE FROM` 较慢,因为它需要逐行处理 [^1][^3][^4]。 - **事务支持**:`TRUNCATE TABLE` 不能回滚,会隐式提交;`DELETE FROM` 可以回滚 [^1]。 - **触发器**:`TRUNCATE TABLE` 不触发触发器;`DELETE FROM` 会触发触发器 [^1]。 - **自增值重置**:`TRUNCATE TABLE` 会重置自增值;`DELETE FROM` 不会重置自增值 [^1]。 - **WHERE 条件**:`TRUNCATE TABLE` 不支持 `WHERE` 条件,只能删除全量数据;`DELETE FROM` 支持 `WHERE` 条件,可以选择要删除的记录 [^1][^3]。 - **锁机制**:`TRUNCATE TABLE` 使用表级锁;`DELETE FROM` 使用行级锁 [^1]。 - **空间释放**:`TRUNCATE TABLE` 立即释放空间;`DELETE FROM` 不立即释放空间 [^1]。 - **权限要求**:`TRUNCATE TABLE` 需要 `DROP` 权限;`DELETE FROM` 需要 `DELETE` 权限 [^1]。 - **外键关联情况**:表有外键关联时,若外键指定级联删除,`TRUNCATE TABLE` 会删除关联的子表的所有数据;若外键未指定级联,`TRUNCATE TABLE` 逐行删除数据,当存在父行关联子表行数据时,将会报错 [^5]。 ### 使用场景 - **TRUNCATE TABLE**:当需要快速删除表中的所有数据,且不需要保留自增值、不需要回滚操作、不需要触发触发器时,可以使用 `TRUNCATE TABLE`。例如,在测试环境中,每次测试前清空表数据。 - **DELETE FROM**:当需要根据特定条件删除部分数据,或者需要回滚删除操作,或者删除操作需要触发触发器时,应使用 `DELETE FROM`。例如,删除用户表中某个特定用户的记录。 ### 原理 - **TRUNCATE TABLE**:其原理是直接删除并重建表,它不会逐行扫描表来删除数据,而是直接释放存储表数据的数据块,因此速度较快。它会隐式提交事务,无法回滚操作。由于是重建表,自增值会被重置。并且因为没有逐行操作,所以不会触发触发器 [^1][^4]。 - **DELETE FROM**:它是逐行扫描表,根据 `WHERE` 条件(如果有)确定要删除的行,然后逐行删除。每删除一行,都会记录事务日志,所以可以进行回滚操作。由于是逐行操作,会触发相应的触发器。删除操作不会重置自增值,也不会立即释放表占用的空间 [^1][^3]。 ### 代码示例 ```sql -- TRUNCATE TABLE 示例 TRUNCATE TABLE users; -- DELETE FROM 示例 DELETE FROM users WHERE user_id = 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值