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
相关产品推荐
相关产品推荐

