如何在CREATE TABLE块内使用postgresql中的age()函数

ztmd8pv5  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(122)

我正在尝试使用PGadmin在postgresql中创建一个名为Citizens的表,在这个表中有一个名为age的列,我希望在插入新行时计算出这个年龄并将其放入这个列中。我的代码如下所示:

create table citizens(
  first_name VARCHAR(40),
  last_name VARCHAR(45),
  birth_date DATETIME DEFAULT NOW(),
  ssid BIGINT PRIMARY KEY,
  age INTERVAL AGE(TIMESTAMP birth_date),
  );

运行此查询时收到以下错误消息:

ERROR:  syntax error at or near "AGE"
LINE 6:   age INTERVAL AGE(TIMESTAMP birth_date),
                   ^
SQL state: 42601
Character: 156
tuwxkamq

tuwxkamq1#

你要找的是定义

age interval generated always as age(birth_date) virtual

不幸的是Postgres不支持 generated... virtual。你最好的选择是从表中删除列,然后创建一个派生该列的视图。

create view citizens_vw as 
   select *, age(birth_date) as age
     from citizens;

或者,更好的是,正如@ChrisMaurer的评论所说:

create view citizens_vw as 
   select *, extract (year from age(birth_date))::integer as age
     from citizens;

几个注意事项:

  • Postgres没有数据类型DATETIME。您可以使用TIMESTAMP或只使用DATE。
  • NOW()似乎是birth_date默认值的糟糕选择。在这种情况下,将其定义为not null而不使用默认值是更好的选择。不要假设新的citizens只有几秒钟或几天的历史。有时候,处理异常比假设错误的数据(可能永远不会更新)更好。至少恕我直言。

相关问题