删除、截断或删除以清除MySQL中的表

删除、截断或删除以清除MySQL中的表,mysql,sql-delete,sql-drop,Mysql,Sql Delete,Sql Drop,我试图清理一个表,但没有摆脱表的实际结构。我有一个自动递增的id列;我不需要保留ID号,但我确实需要它来保持其自动递增特性。我发现了delete和truncate,但我担心其中一个会完全删除整个表,从而使将来的insert命令变得无用 如何从表中删除所有记录,以便插入新数据?TRUNCATE将重置自动增量种子(至少在InnoDB表上),尽管您可以在截断前记录其值,然后使用以下命令重新设置: 截断表就是您要寻找的 删除表格将删除包含数据的整个表格 delete*from table将删除数据,只保

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


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

TRUNCATE
将重置自动增量种子(至少在InnoDB表上),尽管您可以在截断前记录其值,然后使用以下命令重新设置:


截断表就是您要寻找的

删除表格
将删除包含数据的整个表格

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


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

另一种可能涉及创建表的空副本,设置自动增量(在非原子操作过程中有一些插入的最终余地)然后旋转两个:

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;
Drop就可以做到这一点……删除有问题的表,除非该表是另一个表的父表。

删除将删除所有符合条件的数据;如果未指定条件,则删除表中的所有数据。
Truncate类似于delete;但是,它将自动增量计数器重置回1(或初始起始值)。但是,最好使用truncate而不是delete,因为delete会按每行删除数据,因此比truncate具有更高的性能。但是,truncate不会在强制引用完整性的InnoDB表上工作,除非在发出truncate命令之前将其关闭。

因此,请放松;除非对表发出drop命令,否则它不会被删除。

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

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

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


YMMV,但不管出于什么原因,我在MariaDB 10.3.15-MariaDB-log上删除似乎破坏了我的索引。

注意到自动递增的种子很好!我忘了提到InnoDB
TRUNCATE
没有那么快,因为它确实会在内部删除+创建。在我的开发系统上截断200个小表需要几秒钟…删除数据是完全记录的操作。截断数据的记录最少
DROP TABLE t2_old;