如何为SQLite列中的每一行递增编号?
在SQLite中为列的每一行编号的几种方法
刚好之前处理过类似的需求,给你分享几个实用的方案,分查询生成和直接更新表两种场景:
1. 使用ROW_NUMBER()窗口函数(推荐,SQLite 3.25.0+)
这是最简洁的方式,SQLite从3.25.0版本开始支持窗口函数,非常适合这种生成行号的需求。
场景1:查询时生成行号(不修改原表)
如果只是想在查询结果里看到编号,不需要修改原表的数据,可以直接用:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num, * FROM your_table;
这里ORDER BY (SELECT NULL)表示不指定排序规则,按数据存储的默认顺序生成编号;如果需要按特定列排序生成编号,把(SELECT NULL)换成你要排序的列名就行,比如ORDER BY id。
场景2:直接更新表中的空列,赋值编号
如果要把空列直接更新成1、2、3...这样的编号,可以结合CTE(公共表表达式)来实现:
假设你的表叫test,要更新的空列是num_column,可以这么写:
WITH numbered_rows AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS new_num, rowid -- SQLite默认的行ID,用来唯一标识每行 FROM test ) UPDATE test SET num_column = numbered_rows.new_num FROM numbered_rows WHERE test.rowid = numbered_rows.rowid;
如果你的表有自己的主键(比如id),也可以用主键代替rowid来关联,这样更稳妥。
2. 兼容旧版本SQLite(低于3.25.0)
如果你的SQLite版本比较旧,不支持窗口函数,可以用自增变量的方式来实现:
查询时生成行号
SELECT (SELECT COUNT(*) FROM your_table t2 WHERE t2.rowid <= t1.rowid) AS row_num, * FROM your_table t1;
这个方法通过子查询统计当前行之前的行数来生成编号,缺点是数据量大的时候性能会差一些,但胜在兼容旧版本。
更新表中的空列
UPDATE your_table SET num_column = (SELECT COUNT(*) FROM your_table t2 WHERE t2.rowid <= your_table.rowid);
同样是用子查询统计行数来赋值,适合小数据量的表。
小提示
- 如果你的表有明确的排序需求,记得把
rowid换成你要排序的列,确保编号顺序符合预期; - 用
rowid的时候要注意,如果你手动指定了主键且类型是INTEGER PRIMARY KEY,那么主键会和rowid是同一个值,用主键关联更清晰。
内容的提问来源于stack exchange,提问作者SBrain
相关产品推荐
相关产品推荐

