PostgreSQL如何根据另一张表的字段值批量插入对应行数
按用户票据配额批量插入票务记录的解决方案
PostgreSQL 场景(你提到的serial为PostgreSQL原生自增字段类型,优先使用此方案)
直接使用内置generate_series函数实现,单条语句即可完成需求:
INSERT INTO tickets (user_id) SELECT u.user_id FROM users u CROSS JOIN generate_series(1, u.quantity) AS gs;
逻辑说明:对users表中的每一行用户记录,生成quantity个连续数字的序列,交叉连接后会为每个用户输出对应quantity行的user_id,插入时ticket_id作为serial类型会自动生成值,最终结果完全匹配你给出的示例要求。
MySQL 8.0+ 场景
可以用递归CTE实现批量生成:
WITH RECURSIVE ticket_rows AS ( SELECT user_id, quantity, 1 AS row_idx FROM users UNION ALL SELECT user_id, quantity, row_idx + 1 FROM ticket_rows WHERE row_idx < quantity ) INSERT INTO tickets (user_id) SELECT user_id FROM ticket_rows ORDER BY user_id, row_idx;
逻辑说明:递归CTE从序号1开始生成,直到序号等于用户的配额quantity,每个用户会生成对应行数的记录。
通用兼容方案(适配所有支持标准SQL的数据库)
提前创建一张存储连续数字的辅助表nums(表内仅含一个数字字段n,提前插入1、2、3……等足够多的连续数字,最大值不小于你业务中最大的单用户配额),执行以下语句即可:
INSERT INTO tickets (user_id) SELECT u.user_id FROM users u INNER JOIN nums n ON n.n <= u.quantity;
注意:执行插入操作前,可以先把语句中的
INSERT INTO tickets (user_id)替换为SELECT,确认生成的记录数、user_id分布符合预期后再执行插入,避免产生脏数据。
内容的提问来源于stack exchange,提问作者Ana Cruz
相关产品推荐
相关产品推荐

