使用CTE生成统一UUID插入多语言变体数据失败的技术咨询
问题分析与解决
你的SQL写法报错是因为SELECT子句里的(uuid, 'page', 'en-us')是行构造器语法,它会生成单个复合列(而非三个独立列),但INSERT需要对应表的三个列,导致列数/类型不匹配。
下面是两种可行的修正方案,都能实现用同一个UUID插入多语言变体,并且返回插入结果:
方案1:使用UNION ALL拼接行
WITH data AS ( SELECT uuid_generate_v4() AS uuid ) INSERT INTO content (id, type, locale) SELECT uuid, 'page', 'en-us' FROM data UNION ALL SELECT uuid, 'page', 'es-mx' FROM data RETURNING *;
方案2:用CROSS JOIN关联UUID与语言变体(更易扩展)
如果后续要添加更多语言,直接在VALUES里追加行即可,无需重复写SELECT语句:
WITH data AS ( SELECT uuid_generate_v4() AS uuid ) INSERT INTO content (id, type, locale) SELECT d.uuid, v.type, v.locale FROM data d CROSS JOIN ( VALUES ('page', 'en-us'), ('page', 'es-mx') -- 可在此添加更多语言变体,比如 ('page', 'zh-cn') ) v(type, locale) RETURNING *;
RETURNING *会返回所有成功插入的行,满足你需要获取插入结果的需求- 两种方案都依赖CTE生成的唯一UUID,确保所有插入行共享同一个
id值,配合locale组成复合主键
内容的提问来源于stack exchange,提问作者AlfredoDaAs
相关产品推荐
相关产品推荐

