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

