(我在MySql中试过这个)
我相信它们在语义上是等价的.为什么不识别这个微不足道的案例并加快速度呢?
truncate table无法回滚,就像删除并重新创建表一样.
......只是添加一些细节.
调用DELETE语句会告诉数据库引擎生成已删除的所有记录的事务日志.如果删除错误,您可以恢复记录.
调用TRUNCATE语句是一个"全有或全无"的毯子,它删除所有没有要从中恢复的事务日志的记录.它肯定更快,但只有当您确定不需要任何要删除的记录时才应该这样做.
从表中删除一次删除一行中的每一行,并将记录添加到事务日志中,以便可以回滚操作.删除所花费的时间也与表上的索引数成比例,并且是否存在任何外键约束(对于innodb).
截断有效地删除表并重新创建它,并且无法在事务中执行.因此,它需要更少的操作并快速执行.截断也不使用任何删除触发器.
有关MySql更快的详细信息,请参阅MySql文档:http: //dev.mysql.com/doc/refman/5.0/en/truncate-table.html
你的问题是关于MySQL的,我对MySQL作为产品几乎一无所知,但我想我会在SQL Server中添加一个TRUNCATE语句可以回滚.亲自试试吧
create table test1 (col1 int) go insert test1 values(3) begin tran truncate table test1 select * from test1 rollback tran select * from test1
在SQL Server中记录了TRUNCATE,它只是没有以记录DELETE的冗长方式登录.我相信它被称为最小化记录操作.实际上,数据页仍然包含数据,但它们的范围已被标记为删除.只要数据页仍然存在,您就可以回滚截断.希望这是有帮助的.如果有人在MySQL上尝试,我有兴趣知道结果.