我需要从表中删除所有行,但在添加新行时,我希望自动增量的主键ID从0开始分别重新开始从1MySQL从表中删除所有行并将ID重置为零
回答
不要删除,使用截断:
Truncate table XXX
表处理程序不记得上次使用的AUTO_INCREMENT值,而是开始从一开始计数。即使对于MyISAM和InnoDB,这通常也不会重用序列值。
如果您无法使用(因为外键约束,例如)TRUNCATE
您可以使用ALTER TABLE删除所有行后,重新启动AUTO_INCREMENT:
ALTER TABLE mytable AUTO_INCREMENT = 1
这不适合我。可能是什么原因? –
@NBhargav由于您可能在您的表上使用InnoDB引擎而不是MyISAM,因此第一个不支持重置索引。 –
如何在更改auto_increment值之前删除所有行 –
一个有趣的事实。
我确信TRUNCATE
总会有更好的表现,但在我的情况下,与外键,人口只有几行约30表的数据库,它花了大约12秒,TRUNCATE
所有表,而不是只几百毫秒到DELETE
的行。 设置自动增量总共增加了大约一秒,但仍然好很多。
所以我会建议尝试两个,看看哪个工作更快为您的情况。
如果表有外键,然后我总是用下面的代码:
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 ;
但差异会在执行时间。看看Sorin的答案。
这是在任何表中使用孤立数据的好方法,这些数据表中的外键将被清除。据我所知,在事实之后启用外键检查不会导致MySQL重新验证这些外键。这使您在参考表中包含包含*不存在*的数据的行。你甚至可以在你的桌子上甚至没有*外键。 – cimmanon
- 1. 删除表格中的所有行,并重置自动增量
- 2. 从所有表中删除记录ID
- 3. 从列表中删除一行并将所有连续行删除到N?
- 4. 对于ID值大于零的所有ID,删除ID等于零的行。
- 5. 从mysql表中删除所有记录
- 6. MySQL从表中删除所有索引
- 7. C#从所有值为零的数据表中删除列
- 8. mysql从表中删除重复行
- 9. 删除所有前导零并将数字转化为正数
- 10. 为一个ID删除所有行R
- 11. 删除其中所有值都为零
- 12. Rails Postgres:将表中的所有字段设置为零,除了
- 13. 删除mysql中除重复行之外的所有行
- 14. 删除从表中共享相同ID的所有行
- 15. 清除表中的所有行,将标识规范重置为零并且不影响外键?
- 16. 从所有表中删除行
- 17. 删除所有B,A从表的MySQL
- 18. 从一个重复的数据表中删除所有行
- 19. 从数组列表中删除所有的零?
- 20. VB.NET从dataTable删除行将删除所有行
- 21. 删除Mysql表中的重复行并只保留一行
- 22. 删除MySQL中的所有表限制
- 23. 如何删除MySQL中的所有表?
- 24. 在qt中清除/重置模型(删除所有行)
- 25. 删除所有旧表并在dbflow中重新创建表
- 26. 从表中获取所有的ID MYSQL
- 27. 从mysql表中删除重复项?
- 28. MySql - 从表中删除重复
- 29. 从数据库的所有表中删除所有行
- 30. 删除所有数据后将主键重置为1
截断可与非约束表很好地协作,但如果您的表具有外键约束,则可以考虑使用Delete方法。如果您有FK约束,请参阅此帖:[truncate foreign key constrained table](http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) –
请记住截断表不会回滚 –