YugabyteDB是否支持指定生成列?不支持有无替代方案?
YugabyteDB对两种生成列的支持情况及方案
YugabyteDB完全支持你提到的两种STORED类型生成列——它兼容PostgreSQL的生成列特性,且示例中用到的LEAST()、lower()函数以及JSONB提取操作符->>均为YugabyteDB内置支持的功能。
可直接运行的完整SQL示例
创建包含目标生成列的表:
CREATE TABLE user_confirmations ( email_confirmed_at timestamptz, phone_confirmed_at timestamptz, identity_data jsonb, confirmed_at timestamptz GENERATED ALWAYS AS (LEAST(email_confirmed_at, phone_confirmed_at)) STORED, email text GENERATED ALWAYS AS (lower(identity_data->>'email')) STORED );
插入测试数据验证:
INSERT INTO user_confirmations (email_confirmed_at, phone_confirmed_at, identity_data) VALUES ('2024-01-01 10:00:00+08', '2024-01-02 09:00:00+08', '{"email": "USER@EXAMPLE.COM"}');
查询生成列结果:
SELECT confirmed_at, email FROM user_confirmations;
返回结果将符合预期:confirmed_at取两个时间的最小值,email转为小写格式。
旧版本兼容替代方案(若使用YugabyteDB 2.1之前版本)
如果你的YugabyteDB版本不支持生成列(2.1版本及以上已支持),可以用触发器实现等效逻辑:
针对confirmed_at列的触发器
CREATE OR REPLACE FUNCTION update_confirmed_at() RETURNS TRIGGER AS $$ BEGIN NEW.confirmed_at = LEAST(NEW.email_confirmed_at, NEW.phone_confirmed_at); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_update_confirmed_at BEFORE INSERT OR UPDATE ON user_confirmations FOR EACH ROW EXECUTE FUNCTION update_confirmed_at();
针对email列的触发器
CREATE OR REPLACE FUNCTION update_email() RETURNS TRIGGER AS $$ BEGIN NEW.email = lower(NEW.identity_data->>'email'); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_update_email BEFORE INSERT OR UPDATE ON user_confirmations FOR EACH ROW EXECUTE FUNCTION update_email();
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

