如何在PostgreSQL的DBeaver中批量插入1000条带唯一约束的数据?
在DBeaver中给PostgreSQL批量插入1000条带唯一键的数据
方法一:用generate_series批量生成插入(最简便)
直接利用PostgreSQL原生的generate_series函数生成连续的唯一键值,一次性完成1000条数据插入,无需显式循环,效率远高于逐条插入。
示例SQL(假设id从21开始,reference从0001开始递增):
INSERT INTO TABLENAME (id, country, reference, status) SELECT 21 + s.idx AS id, 'INDIA' AS country, -- 若需多国家随机,可替换为 array['INDIA','CHINA','USA'][(random()*3)+1::int] LPAD((s.idx + 1)::TEXT, 4, '0') AS reference, -- 生成0001、0002...格式的固定长度字符串 'Pass' AS status FROM generate_series(0, 999) AS s(idx); -- 生成0到999共1000个序列值
如果表中已有部分数据,担心唯一键冲突,可添加冲突处理逻辑:
INSERT INTO TABLENAME (id, country, reference, status) SELECT 21 + s.idx AS id, 'INDIA' AS country, LPAD((s.idx + 1)::TEXT, 4, '0') AS reference, 'Pass' AS status FROM generate_series(0, 999) AS s(idx) ON CONFLICT (id, reference) DO NOTHING; -- 遇到冲突直接跳过,也可改用DO UPDATE更新字段
DBeaver执行步骤:
- 打开目标数据库的SQL编辑器
- 替换
TABLENAME为你的表名,按需调整id起始值、reference格式等参数 - 点击执行按钮(▶️)即可完成插入
方法二:用PL/pgSQL匿名块循环插入(适合复杂逻辑)
如果需要更灵活的生成规则(比如随机status、多国家组合),可以用PostgreSQL的PL/pgSQL写匿名块实现循环插入。
示例代码:
DO $$ DECLARE v_counter INT := 0; BEGIN WHILE v_counter < 1000 LOOP INSERT INTO TABLENAME (id, country, reference, status) VALUES ( 21 + v_counter, -- id从21开始递增 CASE (random()*2)::INT -- 随机选择国家 WHEN 0 THEN 'INDIA' WHEN 1 THEN 'CHINA' ELSE 'USA' END, LPAD((v_counter + 1)::TEXT, 4, '0'), -- 保持reference格式递增 CASE (random()*1)::INT -- 随机生成Pass/Fail状态 WHEN 0 THEN 'Pass' ELSE 'Fail' END ) ON CONFLICT (id, reference) DO NOTHING; -- 处理唯一键冲突 v_counter := v_counter + 1; END LOOP; END $$;
执行方式与方法一一致,在DBeaver的SQL编辑器中运行即可。
注意事项
- 确保生成的
id和reference组合唯一:如果表中已有历史数据,需调整起始id和reference的起始值,避免冲突 - 优先选择
generate_series方法:该方法是原生批量插入,比PL/pgSQL循环效率更高 - 若已有外部数据文件(如CSV),也可使用DBeaver的「导入数据」功能(右键目标表→导入数据),直接从文件批量导入
内容的提问来源于stack exchange,提问作者Mindwrap Thinker
相关产品推荐
相关产品推荐

