关于YugabyteDB支持Generated Columns及替代方案的问询
YugabyteDB对PostgreSQL 12 Generated Columns的支持情况及替代方案
目前YugabyteDB暂不支持PostgreSQL 12引入的STORED类型生成列(即GENERATED ALWAYS AS (...) STORED语法),不过该特性已被纳入官方开发路线图,后续版本会逐步实现支持。
针对你的需求,可以采用以下两种替代方案:
1. 触发器(Trigger)
通过创建BEFORE INSERT/UPDATE触发器,在数据插入或更新时自动计算并填充目标列,实现与生成列一致的自动计算效果。示例代码如下:
-- 定义计算函数 CREATE OR REPLACE FUNCTION normalize_animal_name() RETURNS TRIGGER AS $$ BEGIN NEW.normalized_name := upper(NEW.name::text); RETURN NEW; END; $$ LANGUAGE plpgsql; -- 创建基础表 CREATE TABLE animal ( id int NOT NULL GENERATED ALWAYS AS IDENTITY, name text, normalized_name text ); -- 绑定触发器到表 CREATE TRIGGER trigger_normalize_animal_name BEFORE INSERT OR UPDATE ON animal FOR EACH ROW EXECUTE FUNCTION normalize_animal_name();
注意:触发器会带来一定的性能开销,批量操作时需要评估影响。
2. 视图(View)
如果不需要持久化存储计算结果,可以创建视图动态计算目标列。这种方式无需额外存储资源,但无法对计算列创建索引,适合仅需查询场景:
-- 创建基础表 CREATE TABLE animal ( id int NOT NULL GENERATED ALWAYS AS IDENTITY, name text ); -- 创建包含计算列的视图 CREATE VIEW animal_with_normalized AS SELECT id, name, upper(name::text) AS normalized_name FROM animal;
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

