You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:如何基于另一列值自动更新列内容

自动根据手机号前缀更新country字段的PostgreSQL实现

1. 创建触发器函数

这个函数会根据新插入的mobile_phone字段前缀,自动给country字段赋值:

CREATE OR REPLACE FUNCTION update_country_func()
RETURNS TRIGGER AS $$
BEGIN
    -- 根据手机号前两位匹配对应国家代码
    NEW.country := CASE
        WHEN LEFT(NEW.mobile_phone, 2) = '51' THEN 'PE'
        WHEN LEFT(NEW.mobile_phone, 2) = '56' THEN 'CL'
        WHEN LEFT(NEW.mobile_phone, 2) = '57' THEN 'CO'
        -- 前缀不匹配规则时,可自定义默认值(这里设为NULL)
        ELSE NULL
    END;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

2. 创建BEFORE INSERT触发器

使用BEFORE INSERT触发器可以在数据插入到表之前完成country字段赋值,避免额外的更新操作,性能更优:

CREATE TRIGGER trigger_update_country
BEFORE INSERT ON info
FOR EACH ROW
EXECUTE FUNCTION update_country_func();

3. 测试效果

插入测试数据:

INSERT INTO info (mobile_phone) VALUES 
('51682815'),
('51261728'),
('56682815'),
('56261728'),
('57682815'),
('57261728');

查询表数据:

SELECT mobile_phone, country FROM info;

返回结果将完全符合你的预期:

mobile_phonecountry
'51682815''PE'
'51261728''PE'
'56682815''CL'
'56261728''CL'
'57682815''CO'
'57261728''CO'

补充说明

  • 若需要支持修改手机号后同步更新country,可修改触发器触发时机:
    DROP TRIGGER IF EXISTS trigger_update_country ON info;
    CREATE TRIGGER trigger_update_country
    BEFORE INSERT OR UPDATE ON info
    FOR EACH ROW
    EXECUTE FUNCTION update_country_func();
    
  • 若手机号可能为空,函数会自动将country设为NULL,你可根据需求调整ELSE分支的默认值。

内容的提问来源于stack exchange,提问作者Iván Mateo Zimic García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:01:05