20

我正在尝试清理表格,但没有摆脱表格的实际结构。我有一个id自动递增的列;我不需要保留 ID 号,但我确实需要它来保持其自动递增特性。我发现了删除和截断,但我担心其中之一会完全删除整个表,从而使未来的插入命令变得无用。

如何从表中删除所有记录以便插入新数据?

4

6 回答 6

24

drop table将删除整个表的数据

delete * from table将删除数据,只保留自动增量值。如果表中有很多数据,也需要一段时间。

truncate table将删除数据,重置自动增量值(但将它们保留为自动增量列,因此它将从 1 开始并再次从那里上升),并且非常快。

于 2010-04-08T16:19:56.550 回答
15

TRUNCATE将重置您的自动增量种子(至少在 InnoDB 表上),尽管您可以在截断之前记下它的值,然后使用alter table相应地重新设置:

ALTER TABLE t2 AUTO_INCREMENT = value
于 2010-04-08T16:17:26.953 回答
5

   Drop将这样做....删除有问题的表,除非该表是另一个表的父表。

   删除将删除所有满足条件的数据;如果没有指定条件,它将删除表中的所有数据。
   截断类似于删除;但是,它将 auto_increment 计数器重置为 1(或初始起始值)。但是,最好使用 truncate 而不是 delete,因为delete按每一行删除数据,因此比truncate会降低性能。但是,除非在truncate之前将其关闭,否则truncate将不适用于强制执行引用完整性的InnoDB表命令发出。
   所以,放松;除非您在桌子上发出drop命令,否则它不会被删除。

于 2012-09-10T09:26:47.317 回答
2

截断表是您正在寻找的 http://www.1keydata.com/sql/sqltruncate.html

于 2010-04-08T16:17:40.790 回答
1

另一种可能性涉及创建表的空副本,设置 AUTO_INCREMENT (在非原子操作期间为插入留有一些最终余地),然后旋转两者:

CREATE TABLE t2_new LIKE t2;

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
  FROM information_schema.tables
 WHERE table_name='t2';

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

RENAME TABLE t2 TO t2_old, t2_new TO t2;

然后,您还有一个额外的优势,即在移除旧表之前仍然可以改变主意。

如果您重新考虑您的决定,您仍然可以在操作之前从表中取回旧记录:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/;

当你很好时,你可以删除旧表:

DROP TABLE t2_old;
于 2012-09-10T09:02:54.737 回答
0

与全文 InnoDB 查询中的 TRUNCATE 相比,我刚刚遇到了 DELETE 严重影响 SELECT 性能的情况。

如果我删除所有行然后重新填充表(100 万行),典型的查询需要 1 秒才能返回。

相反,如果我截断表,并以完全相同的方式重新填充它,典型的查询需要 0.05 秒才能返回。

YMMV,但无论出于何种原因,MariaDB 10.3.15-MariaDB-log DELETE 似乎都在破坏我的索引。

于 2019-06-19T13:41:05.477 回答