我很想知道我做错了什么,
我想在oracle中添加一个CHECK约束,以确保用户超过18
所以我做了
ALTER TABLE User
ADD CONSTRAINT check_age CHECK(TO_CHAR(SYSDATE, 'yyyy/mm/dd')- TO_CHAR(dateOfBirth, 'yyyy/mm/dd')> 18)
但我收到错误
原因:尝试使用日期常量或系统变量, 例如USER,在一个不完全的检查约束中 在CREATE TABLE或ALTER TABLE语句中指定。对于 例如,指定的日期没有世纪。 *操作:完全指定日期常量或系统变量。 设置事件10149允许约束,例如“a1> '10 -MAY-96'”, 允许在版本8之前创建的错误。
为什么这是错的?
我仍然不明白为什么我不能添加它,如果有人可以向我解释,我会很乐意
谢谢
答案 0 :(得分:1)
从Oracle 11g开始,虽然您无法在约束中直接使用sysdate
,但您可以使用虚拟列获得相同的效果:
create function over_18 (
p_birth_date in User.dateOfBirth%type
) return varchar2 deterministic is
begin
return case when months_between(sysdate, p_birth_date) /12 > 18 then 'Y' else 'N' end;
end over_18;
/
alter table User add (over_18_ind as (cast(over_18(dateOfBirth) as varchar2(1))));
/
alter table User add constraint check_age check (over_18_ind = 'Y');
/
基于文章here。
即使Oracle允许您在约束中使用sysdate
,您的约束也无论如何都会起作用,因为您将日期转换为的格式无法隐式转换回数字以减去(我提供的)替代年龄检查)。