PostgreSQL向含20+列的表插入数据有没有更整洁清晰的写法?
PostgreSQL 不支持你示例中直接在VALUES子句里写列名:值的语法,但有以下3种常用替代方案可以实现列名与值相邻的可读性需求:
- 方案1:批量插入+行别名(兼顾性能和可读性,适合行数多、列数多的场景)
INSERT INTO your_table (col1, col2, col3, col12, col25) SELECT * FROM (VALUES ( 'valA1' AS col1, 'valA2' AS col2, 'valA3' AS col3, 'valA12' AS col12, 'valA25' AS col25 ), ( 'valB1' AS col1, 'valB2' AS col2, 'valB3' AS col3, 'valB12' AS col12, 'valB25' AS col25 ) ) AS t;
写法中AS 列名仅用于提升可读性,实际插入时按VALUES内的值顺序匹配INSERT后的列列表,调整列顺序时两边同步即可。
- 方案2:JSON键值对插入(完全避免列顺序错位问题)
INSERT INTO your_table (col1, col2, col3, col12, col25) SELECT (j->>'col1')::text, (j->>'col2')::text, (j->>'col3')::text, (j->>'col12')::text, (j->>'col25')::text FROM ( SELECT jsonb_array_elements( '[ {"col1": "valA1", "col2": "valA2", "col3": "valA3", "col12": "valA12", "col25": "valA25"}, {"col1": "valB1", "col2": "valB2", "col3": "valB3", "col12": "valB12", "col25": "valB25"} ]'::jsonb) AS j ) AS t;
通过JSON结构存储每行的键值对,再解析成对应列插入,列的排列顺序不影响插入结果,完全消除值和列对应错误的可能,适合对正确性要求高、列数极多的场景。
- 方案3:单条INSERT SET写法(最直观,适合插入行数少的场景)
INSERT INTO your_table SET col1 = 'valA1', col2 = 'valA2', col12 = 'valA12', col25 = 'valA25'; INSERT INTO your_table SET col1 = 'valB1', col2 = 'valB2', col12 = 'valB12', col25 = 'valB25';
PostgreSQL支持INSERT ... SET语法,每列直接和值配对,可读性最高,仅插入性能略低于批量VALUES写法,行数少于100的场景几乎感知不到性能差异。
内容的提问来源于stack exchange,提问作者Daniel W
相关产品推荐
相关产品推荐

