PostgreSQL带自动生成列的表插入值及列位置设置问题
解决PostgreSQL生成列(Generated Column)插入时的位置限制问题
核心原因
PostgreSQL的GENERATED ALWAYS AS ... STORED生成列不允许手动赋值,当它不在表结构末尾时,直接使用无列名的INSERT VALUES会因列数不匹配或非法赋值报错。解决的核心是明确告诉数据库哪些列需要插入数据。
解决方法
1. 显式指定插入列(推荐)
插入时明确列出要插入的列名,完全跳过生成列,无论它在表结构的哪个位置都能正常执行:
-- 示例:假设表结构为 id, years_at_club, player_name, club_debut INSERT INTO liverpool_players_new (id, player_name, club_debut) VALUES (1, 'Mohamed Salah', '2017-06-22');
这种方式最清晰,也符合SQL最佳实践,避免因表结构变更导致的插入错误。
2. 使用DEFAULT关键字匹配列数
如果必须写出所有列(比如批量插入脚本要求),可以在生成列的位置填写DEFAULT,PostgreSQL会自动使用生成列的计算值:
INSERT INTO liverpool_players_new (id, years_at_club, player_name, club_debut) VALUES (1, DEFAULT, 'Mohamed Salah', '2017-06-22');
额外注意事项
- 避免使用
GENERATED BY DEFAULT AS ...替代GENERATED ALWAYS,前者允许手动赋值,会破坏生成列自动计算的逻辑,导致数据不一致。 - 确保生成列的公式依赖的列(如
club_debut)已正确定义且非空,否则会触发计算错误。
内容的提问来源于stack exchange,提问作者Day Manizo
相关产品推荐
相关产品推荐

