重置 SQLite3/MySQL 中的行数计数

Posted

技术标签:

【中文标题】重置 SQLite3/MySQL 中的行数计数【英文标题】:Reset the row number count in SQLite3/MySQL 【发布时间】:2011-03-27 11:55:21 【问题描述】:

我正在使用 SQLite3。我使用整数作为主 ID 加载一个包含 30 行的表,它会自动递增。

现在我从表中删除所有行,然后将一些新信息重新加载到表中。

问题是:行数(我的 PrimaryID)现在从 31 开始。有什么方法可以从数字 1 开始加载新行吗?

【问题讨论】:

【参考方案1】:

SQLite

用途:

DELETE FROM your_table;    
DELETE FROM sqlite_sequence WHERE name = 'your_table';

Documentation

SQLite 使用特殊的 SQLITE_SEQUENCE 表来跟踪表曾经拥有的最大 ROWID。每当创建包含 AUTOINCREMENT 列的普通表时,就会自动创建和初始化 SQLITE_SEQUENCE 表。可以使用普通的 UPDATE、INSERT 和 DELETE 语句修改 SQLITE_SEQUENCE 表的内容。但是对这个表进行修改可能会扰乱 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。

在 SO 上找到答案:SQLite Reset Primary Key Field

mysql

用途:

ALTER TABLE tbl AUTO_INCREMENT = 1;

在任何一种情况下,数据库都不关心 id 编号是否是连续的 - 只是值是唯一的。如果用户从来没有看到主键值(他们不应该看到,因为数据可以改变并且不会总是在那个主键值上),我不会为这些选项而烦恼。

【讨论】:

如果您这样做AUTO_INCREMENT = 0,插入的第一条记录会以id 开头还是0 或1? @JohnB:谢谢,值需要为 1 才能在我的 5.1.35 上重置 - 我更新了我的答案。将其设置为零不会返回错误 - 序列不变。 @quantomSoup:见对 JohnB 的评论【参考方案2】:

对于 MySQL:

使用TRUNCATE TABLE tablename清空表(删除所有记录)并重置自动递增计数。

如果您只想重置计数,也可以使用ALTER TABLE tablename AUTO_INCREMENT = 0;

对于 SQLite:

DELETE FROM tablename;
DELETE FROM SQLITE_SEQUENCE WHERE name='tablename';

参考文献

SQLite AutoIncrementMySQL AutoIncrement

【讨论】:

在 MySQL 上将 auto_increment 设置为零不会将该值重置为 1;它采用基于现有值的下一个最高值。【参考方案3】:

供SQLite使用(不需要删除和创建表)

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';

MySql 使用

ALTER TABLE table_name AUTO_INCREMENT = 1;

【讨论】:

【参考方案4】:

在这种情况下,您不应使用 AUTOINCREMENT。只需将您的主键定义为INTEGER PRIMARY KEY,在DELETE FROM 查询后计数将重置为1。如果没有 AUTOINCREMENT,默认行为仍然是主键的自动递增,只要您的表中没有空间不足(在这种情况下,旧的 - 已删除 - 值将被重用)。

SQLite Autoincrement 文档中提供了更多信息。

【讨论】:

迄今为止最准确的答案。根据 sqlite website,“AUTOINCREMENT 关键字会带来额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要。”(强调)【参考方案5】:
ALTER TABLE tbl AUTO_INCREMENT = 0;

【讨论】:

以上是关于重置 SQLite3/MySQL 中的行数计数的主要内容,如果未能解决你的问题,请参考以下文章

在 TSQL 中,如何添加一个计数列来计算查询中的行数?

如果列中的不同计数达到 10,则只返回 true/false,而不是检查 spark 中的行数

MySql 的行数并插入到计数的表中

部分中的行数

当每个部分的行数不同时,如何获取 numberOfRows 的计数?

使用group by时如何计算列中的行数