You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:21:02