我正在尝试清理表格,但没有摆脱表格的实际结构。我有一个id
自动递增的列;我不需要保留 ID 号,但我确实需要它来保持其自动递增特性。我发现了删除和截断,但我担心其中之一会完全删除整个表,从而使未来的插入命令变得无用。
如何从表中删除所有记录以便插入新数据?
我正在尝试清理表格,但没有摆脱表格的实际结构。我有一个id
自动递增的列;我不需要保留 ID 号,但我确实需要它来保持其自动递增特性。我发现了删除和截断,但我担心其中之一会完全删除整个表,从而使未来的插入命令变得无用。
如何从表中删除所有记录以便插入新数据?
drop table
将删除整个表的数据
delete * from table
将删除数据,只保留自动增量值。如果表中有很多数据,也需要一段时间。
truncate table
将删除数据,重置自动增量值(但将它们保留为自动增量列,因此它将从 1 开始并再次从那里上升),并且非常快。
TRUNCATE
将重置您的自动增量种子(至少在 InnoDB 表上),尽管您可以在截断之前记下它的值,然后使用alter table相应地重新设置:
ALTER TABLE t2 AUTO_INCREMENT = value
Drop将这样做....删除有问题的表,除非该表是另一个表的父表。
删除将删除所有满足条件的数据;如果没有指定条件,它将删除表中的所有数据。
截断类似于删除;但是,它将 auto_increment 计数器重置为 1(或初始起始值)。但是,最好使用 truncate 而不是 delete,因为delete按每一行删除数据,因此比truncate会降低性能。但是,除非在truncate之前将其关闭,否则truncate将不适用于强制执行引用完整性的InnoDB表命令发出。
所以,放松;除非您在桌子上发出drop命令,否则它不会被删除。
截断表是您正在寻找的 http://www.1keydata.com/sql/sqltruncate.html
另一种可能性涉及创建表的空副本,设置 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;
与全文 InnoDB 查询中的 TRUNCATE 相比,我刚刚遇到了 DELETE 严重影响 SELECT 性能的情况。
如果我删除所有行然后重新填充表(100 万行),典型的查询需要 1 秒才能返回。
相反,如果我截断表,并以完全相同的方式重新填充它,典型的查询需要 0.05 秒才能返回。
YMMV,但无论出于何种原因,MariaDB 10.3.15-MariaDB-log DELETE 似乎都在破坏我的索引。