digoal
2022-10-26
PostgreSQL , GENERATED ALWAYS AS , VIRTUAL , STORED
在表里面存储年龄是一件很尴尬的事情, 因为每年都会增长. 需要修改, 所以可以存储为出生日期, 然后使用虚拟列来保存年龄.
GENERATED ALWAYS AS
自动产生value的列, 可以使用GENERATED ALWAYS AS语法, 标准情况支持2种情况:
- STORED. 存储自动产生的值(insert,update,drop依赖值时,自动更新对应自动产生值)
- VIRTUAL. 不存储值, 查询到这个列时自动计算, 所以叫虚拟列.
DuckDB 只支持virtual 虚拟列.
例子:
D create table t (id int, birthday date, age int GENERATED ALWAYS AS ((current_date-birthday)/365.25+1) virtual);
D select current_date;
┌─────────────────────┐
│ main.current_date() │
├─────────────────────┤
│ 2022-10-26 │
└─────────────────────┘
D insert into t values (1, '1988-01-01');
D insert into t values (2, '2022-10-26');
D insert into t values (3, '2022-09-26');
D select * from t;
┌────┬────────────┬─────┐
│ id │ birthday │ age │
├────┼────────────┼─────┤
│ 1 │ 1988-01-01 │ 35 │
│ 2 │ 2022-10-26 │ 1 │
│ 3 │ 2022-09-26 │ 1 │
└────┴────────────┴─────┘