PostgreSQL创建Citizens表时使用age()函数生成age列报错求助
解决PostgreSQL创建Citizens表时age列自动计算的语法错误
你的SQL语法错误是因为PostgreSQL不支持直接在列类型后调用AGE()函数来定义计算列,同时还有两个小问题:
- PostgreSQL中没有
DATETIME类型,对应可用TIMESTAMP或更适合生日场景的DATE - 表定义最后一列后多了一个多余的逗号
下面提供两种可行的解决方案:
方法一:使用生成列(PostgreSQL 12+ 推荐)
PostgreSQL 12及以上版本支持存储生成列,可以自动计算并存储age值,无需额外触发器:
CREATE TABLE citizens( first_name VARCHAR(40), last_name VARCHAR(45), birth_date DATE DEFAULT CURRENT_DATE, -- 生日用DATE类型更合适,默认取当前日期 ssid BIGINT PRIMARY KEY, age INTERVAL GENERATED ALWAYS AS (AGE(birth_date)) STORED );
GENERATED ALWAYS AS (AGE(birth_date)) STORED表示该列的值由AGE(birth_date)自动计算,插入或更新birth_date时会同步更新ageAGE()函数会根据birth_date和当前日期计算出时间间隔(即年龄)
方法二:使用触发器(兼容PostgreSQL 12以下版本)
如果你的PostgreSQL版本低于12,可通过触发器函数实现自动计算:
- 创建触发器函数:
CREATE OR REPLACE FUNCTION calculate_citizen_age() RETURNS TRIGGER AS $$ BEGIN NEW.age := AGE(NEW.birth_date); RETURN NEW; END; $$ LANGUAGE plpgsql;
- 创建表并绑定触发器:
CREATE TABLE citizens( first_name VARCHAR(40), last_name VARCHAR(45), birth_date DATE DEFAULT CURRENT_DATE, ssid BIGINT PRIMARY KEY, age INTERVAL ); CREATE TRIGGER trigger_update_citizen_age BEFORE INSERT OR UPDATE ON citizens FOR EACH ROW EXECUTE FUNCTION calculate_citizen_age();
- 触发器会在插入或更新行之前触发,自动计算并填充age列的值
内容的提问来源于stack exchange,提问作者user20137453
相关产品推荐
相关产品推荐

