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

如何用PostgreSQL generate_series生成135960条球员数据(含22218个salah名称)

使用PostgreSQL generate_series生成指定球员数据脚本

核心思路

拆分需求为两部分生成数据:22,218个含"salah"的球员,以及剩余113,742个普通球员。利用generate_series批量生成序列,结合随机函数确保数据唯一性与合理性,同时关联已有的cup_matches表满足外键约束。

完整插入脚本

WITH random_mids AS (
    -- 从cup_matches中随机抽取135,960个不重复的mid,用于分配给球员
    SELECT 
        mid, 
        row_number() OVER (ORDER BY random()) AS rn
    FROM public.cup_matches
    LIMIT 135960
),
salah_players AS (
    -- 生成含"salah"的球员数据
    SELECT
        rm.mid,
        -- 加随机后缀确保name主键唯一
        'salah_' || rm.rn || '_' || floor(random()*1000)::varchar AS name,
        -- 生成2000-2024年之间的随机比赛日期
        (DATE '2000-01-01' + (random() * (DATE '2024-12-31' - DATE '2000-01-01'))::int)::date AS year,
        -- 生成1-11的随机位置(适配足球位置编号)
        floor(random()*11 +1)::int AS position
    FROM random_mids rm
    WHERE rm.rn <= 22218
),
regular_players AS (
    -- 生成普通球员数据
    SELECT
        rm.mid,
        'player_' || (rm.rn - 22218) || '_' || floor(random()*1000)::varchar AS name,
        (DATE '2000-01-01' + (random() * (DATE '2024-12-31' - DATE '2000-01-01'))::int)::date AS year,
        floor(random()*11 +1)::int AS position
    FROM random_mids rm
    WHERE rm.rn > 22218
)
-- 合并插入两类球员数据
INSERT INTO public.played_in (mid, name, year, position)
SELECT * FROM salah_players
UNION ALL
SELECT * FROM regular_players;

关键注意事项

  • 唯一性保障:name字段通过固定前缀+序列编号+随机后缀确保主键唯一;mid通过从cup_matches抽取不重复记录满足唯一键约束。
  • 外键合规:脚本依赖cup_matches表存在至少135,960条记录(用户已说明有624,680场比赛,完全满足)。
  • 可调整参数:年份范围、位置编号范围可根据实际业务需求修改对应日期和随机数区间。
  • 性能优化:若插入速度慢,可临时关闭表触发器、调整WAL写入级别,或拆分多次批量插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:44