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

SQLite如何重复指定行n次并修改scene_id为唯一标识?

解决方案

你的递归CTE存在两个核心问题:无效的JOIN连接条件,以及未对scene_id进行后缀拼接。以下是修正后的完整可行方案:

步骤1:确认临时表状态

你已创建的variables和dupedScene临时表无需调整,确保dupedScene的id字段已设为NULL(触发自增机制)即可。

步骤2:修正递归逻辑并执行插入

使用递归CTE生成带字母后缀的序列,与dupedScene交叉连接后拼接新scene_id,最终插入主表:

WITH RECURSIVE counter(x, suffix) AS (
    SELECT 1, 'A'
    UNION ALL
    SELECT x + 1, chr(ascii(suffix) + 1)
    FROM counter
    WHERE x < (SELECT num_files FROM variables)
)
INSERT INTO scenes (created, modified, scene_id) -- 显式列出所有需插入的列(排除id)
SELECT 
    ds.created,
    ds.modified,
    CONCAT(ds.scene_id, '-', c.suffix) AS scene_id
    -- 此处添加原表其余50列,格式为ds.列名
FROM dupedScene ds
CROSS JOIN counter c;

关键细节说明

  • 后缀生成逻辑:通过chr(ascii(suffix) + 1)从'A'依次生成'B'、'C'等字母后缀,完全匹配你需要的格式。
  • 显式指定插入列:原表有50列,显式列出所有字段(排除自增的id)可避免因字段顺序不一致导致的错误,确保所有数据正确复制。
  • CROSS JOIN作用:将dupedScene的单行记录与counter的n行序列做笛卡尔积,生成n条重复记录。

多数据库兼容调整

如果你的数据库不支持chr()和ascii()函数(如SQL Server),可改用ASCII码直接生成后缀:

WITH RECURSIVE counter(x) AS (
    SELECT 1
    UNION ALL
    SELECT x + 1
    FROM counter
    WHERE x < (SELECT num_files FROM variables)
)
INSERT INTO scenes (created, modified, scene_id)
SELECT 
    ds.created,
    ds.modified,
    CONCAT(ds.scene_id, '-', CHAR(64 + x)) AS scene_id -- 64为ASCII码中'A'的前一位
FROM dupedScene ds
CROSS JOIN counter c;

执行后,scenes表会新增4条符合要求的记录,id自动递增为6-9,scene_id分别为EFGH-A至EFGH-D。

内容的提问来源于stack exchange,提问作者urbanspaceman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:41:00