从表格中删除所有


73

什么更快?

DELETE FROM table_name;

要么

DELETE FROM table_name where 1=1;

为什么?

truncate table在访问中起作用吗?


3
对于什么数据库?什么桌子?对于什么大小的数据?
Brian Neal 2010年

2
在衡量双方的时间时,您发现了什么?
格雷格(Greg Hewgill)2010年


1
嗯,我是唯一一个注意到,这是使用错误DELETE * FROM,而不是DELETE FROM?我发现有人不小心将其放入代码中,并且正在寻找它的普遍性。我还做了一张测试桌,果然,对星号不满意。
退出

1
对于MS-Access,DELETE * FROM是正确的。这个问题是一团糟,因为它已经为[mysql]和[ms-access]积累了答案。
安德烈(Andre)

Answers:


159

您可以使用以下查询从表中删除所有行,也请记住,它也会重置身份。

TRUNCATE TABLE table_name

3
不,如果您在原始问题中提到了Access,将会有所帮助。在这种情况下,DELETE FROM table_name将最快地完成工作,如下所示。
Jaymz 2010年

3
请记住,这TRUNCATE将重置AUTO_INCREMENTMySQL表上的所有计数(不确定MS Access是否具有这种功能)。
BoltClock

3
Access不会维护事务日志,这就是为什么不需要TRUNCATE语句,以及为什么DELETE FROM table_name可以很好地完成工作的原因。
Jaymz 2010年

3
应当注意,DELETE和TRUNCATE不是同一件事。TRUNCATE具有副作用,通常需要更多权限才能执行。
唐纳德·伯德

36

这应该更快:

DELETE * FROM table_name;

因为RDBMS不必看where是什么。

不过,您应该可以truncate

truncate table table_name

1
不,Access不支持它。
Jaymz 2010年

Jet将DELETE * FROM Table视为截断,而不是一一删除记录。我不认为它会重置自动编号种子值。这必须用代码或紧凑的方式完成(甚至不能确定它是否会在最近的Jet / ACE迭代中以紧凑的方式重置)。
David-W-Fenton,2010年

我可以证实,如果所有的记录是从Access表中删除,压缩将在2016年访问重置自动编号的种子值


11

2004年有一份 mySQL错误报告,该报告似乎仍然有效。似乎在4.x中,这是最快的:

DROP table_name
CREATE TABLE table_name

TRUNCATE table_name当时在DELETE FROM内部,没有提供任何性能提升。

这似乎已经改变,但仅在5.0.3及更低版本中。从错误报告:

[2005年1月11日16:10] MarkoMäkelä

我现在已经实现了快速的TRUNCATE TABLE,希望它将包含在MySQL 5.0.3中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.