PostgreSQL创建表时如何声明自动拼接多字段值的生成字段
需求实现方案
该需求完全可以实现,主流关系型数据库都支持在表定义中直接声明计算生成的字段,这类字段叫做生成列(Generated Column),使用方式和普通常规字段完全一致,不需要额外调用自定义函数。
推荐方案:使用生成列
你设想的自定义拼接逻辑可以直接写到建表语句的字段定义中,不同数据库的语法差异很小:
PostgreSQL 写法
CREATE TABLE person( id BIGINT, name VARCHAR(50), last_name VARCHAR(50), full_name VARCHAR(101) GENERATED ALWAYS AS (name || ' ' || last_name) STORED );
其中STORED关键字表示该字段会实际写入表的物理存储,新增、修改数据时数据库会自动计算更新该字段的值,查询时和普通字段没有任何差异,直接SELECT * FROM person就能拿到拼接好的full_name。
MySQL 写法
CREATE TABLE person( id BIGINT, name VARCHAR(50), last_name VARCHAR(50), full_name VARCHAR(101) GENERATED ALWAYS AS (CONCAT(name, ' ', last_name)) STORED );
兼容方案:使用触发器(适配不支持生成列的老版本数据库)
如果你使用的数据库版本不支持生成列特性,可以通过触发器自动维护full_name字段,效果和生成列一致:
-- 先创建基础表结构 CREATE TABLE person( id BIGINT, name VARCHAR(50), last_name VARCHAR(50), full_name VARCHAR(101) ); -- 创建字段计算逻辑函数 CREATE OR REPLACE FUNCTION calc_full_name() RETURNS TRIGGER AS $$ BEGIN NEW.full_name = NEW.name || ' ' || NEW.last_name; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 绑定触发器,插入、修改name或last_name时自动更新full_name CREATE TRIGGER trigger_person_full_name BEFORE INSERT OR UPDATE OF name, last_name ON person FOR EACH ROW EXECUTE FUNCTION calc_full_name();
内容的提问来源于stack exchange,提问作者César Castro Aroche
相关产品推荐
相关产品推荐

