重置 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 中的行数计数的主要内容,如果未能解决你的问题,请参考以下文章
如果列中的不同计数达到 10,则只返回 true/false,而不是检查 spark 中的行数