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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:36:03