SQL检查约束以获取规则列表

时间:2018-12-01 16:34:25

标签: sql postgresql

我希望有人能够对此提供帮助。我想为不同类别的驾驶执照和符合资格的最低年龄创建Check约束。例如

Category  -  Age

AM   -       16

A2    -      18

A      -     24

我认为我必须做一些单独的约束才能做到这一点。我想我已经掌握了所有要素,将它们整合在一起只需要一些帮助。

以下是用于检查是否输入了有效许可证类别的SQL;

ALTER TABLE ONLY public."salespeople"

ADD CONSTRAINT CHK_Driverslicense CHECK (spDriverslicense IN ('AM', 'A1', 'A2', 'A', 'B', 'BE', 'W', 'C', 'CE', 'C1', 'C1E', 'D', 'DE', 'D1', 'D1E'));

数据库仅具有“生日”列,没有“岁数”列。我可以确定年龄;

SELECT *,  age(current_date, spdob)

FROM public."salespeople";

将它们组合在一起时遇到问题。

ALTER TABLE ONLY public."salespeople"

ADD CONSTRAINT CHK_AM_16YO CHECK (spDriverslicense = 'AM' AND (age(current_date, spdob) > 16));

我得到的错误是

ERROR: operator does not exist: interval > integer 
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

我认为问题在于年龄= 30岁3个月10天等,因此不能与整数进行比较。这就是我卡住的地方。谢谢。

2 个答案:

答案 0 :(得分:0)

age()函数返回一个INTERVAL,因此不能与整数(例如[interval] > 16)进行比较。

不过,您可以使用extract()函数提取区间的 year 分量,并将其与整数进行比较:

EXTRACT(year FROM AGE(current_date, spdob)) > 16

例如,SELECT EXTRACT(year FROM interval '12 years 11 months')返回12

答案 1 :(得分:0)

请勿使用age()。相反,只需使用日期比较:

ALTER TABLE ONLY public."salespeople"
    ADD CONSTRAINT CHK_AM_16YO
        CHECK (spDriverslicense = 'AM' AND
               spdob >= current_date - interval '16 year'
              );