我需要从一个表中删除所有行,但当我添加一个新行时,我希望主键ID(它具有自动增量)分别从0开始从1开始。
当前回答
如果你不能使用TRUNCATE(例如,由于外键约束),你可以在删除所有行后使用alter表重新启动auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
其他回答
一个有趣的事实。
我确信TRUNCATE总是会执行得更好,但是在我的例子中,对于一个大约有30个带外键的表的数据库,只填充了几行,TRUNCATE所有表需要大约12秒,而DELETE行只需要几百毫秒。 设置自动增量总共增加了大约一秒,但仍然好得多。
所以我建议两种都试试,看看哪种对你的情况更有效。
不要删除,使用truncate:
Truncate table XXX
表处理程序不记得最后使用的AUTO_INCREMENT值,而是从头开始计数。即使对于通常不重用序列值的MyISAM和InnoDB也是如此。
源。
如果你想使用truncate,可以这样:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
如果你不能使用TRUNCATE(例如,由于外键约束),你可以在删除所有行后使用alter表重新启动auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
如果表有外键,那么我总是使用以下代码:
SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction
/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/
SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT; -- make a commit
SET AUTOCOMMIT = 1 ;
但不同之处在于执行时间。看看上面索林的回答。
推荐文章
- MySQL删除表中的所有行,并将ID重置为零
- 在准备语句中使用“like”通配符
- MySQL中的表名是否区分大小写?
- 库未加载:libmysqlclient.16。在OS X 10.6上使用mysql2 gem运行'rails server'时出现dylib错误
- 如何知道MySQL表最近一次更新?
- 在MySQL中的一个查询中更新多个具有不同值的行
- 如果表存在则删除表并创建它,如果不存在则创建它
- MySQL OR与IN性能
- 将值从同一表中的一列复制到另一列
- 删除id与其他表不匹配的sql行
- MySQL CPU使用率高
- INT和VARCHAR主键之间有真正的性能差异吗?
- 拒绝访问;您需要(至少一个)SUPER特权来执行此操作
- 从存储引擎得到错误28
- "where 1=1"语句