PostgreSQL插入时将两列值合并至第三列的实现方案
问题描述
尝试执行以下SQL语句创建表:
CREATE TABLE test_table ( column_1 varchar(255), column_2 varchar(255), combined varchar(255) DEFAULT concat(column_1, '_', column_2) );
执行后出现错误:
ERROR: cannot use column reference in DEFAULT expression
需求是在插入操作时自动将column_1和column_2的内容合并到combined列,示例如下:
INSERT INTO test_table (column_1, column_2) VALUES ('Alpha', 'Beta'); SELECT * FROM test_table; -- 预期结果:('Alpha', 'Beta', 'Alpha_Beta')
备注:
- 输入始终为字符串类型
- 输入内容长度通常不超过20字符
- 无法生成dbfiddle链接
解决方案结论
使用**生成列(GENERATED ALWAYS)可实现将合并值存储在第三列的需求;而视图(VIEW)**方案更优,能够避免数据冗余。已知输入不会为空或NULL,该条件初始提问未提及。
生成列(GENERATED ALWAYS)方案
创建表时将combined定义为存储型生成列,由column_1和column_2自动计算生成,无需手动维护:
CREATE TABLE test_table ( column_1 varchar(255), column_2 varchar(255), combined varchar(255) GENERATED ALWAYS AS (concat(column_1, '_', column_2)) STORED );
插入数据时仅需指定column_1和column_2的值,combined列会自动生成对应合并内容。
视图(VIEW)方案
不在原表中存储combined列,而是创建视图实时计算合并值,从根源避免数据冗余:
-- 先创建基础表 CREATE TABLE test_table ( column_1 varchar(255), column_2 varchar(255) ); -- 创建包含合并列的视图 CREATE VIEW test_table_with_combined AS SELECT column_1, column_2, concat(column_1, '_', column_2) AS combined FROM test_table;
插入数据到基础表后,查询视图即可获取包含合并值的完整结果:
INSERT INTO test_table (column_1, column_2) VALUES ('Alpha', 'Beta'); SELECT * FROM test_table_with_combined; -- 返回结果:('Alpha', 'Beta', 'Alpha_Beta')
内容的提问来源于stack exchange,提问作者Cogito Ergo Sum
相关产品推荐
相关产品推荐

