我想在Oracle服务器的表中添加约束。
如果用户从芬兰插入公民,我怎么能检查电话号码是10个号码(不是字母)?
这是我的代码:
ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (CASE Country WHEN 'Finland' THEN REGEXP_LIKE(Phone,'^[0-9]{10}$') END );
但是我收到以下错误:
ORA-00920:无效的关系运算符
答案 0 :(得分:1)
尝试以适当的方式重写条件
ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (( Country ='Finland' and REGEXP_LIKE(Phone,'^[0-9]{10}$')) or (Country!='Finland' or Country is null));
答案 1 :(得分:0)
检查约束需要解析为布尔表达式,并且案例解析为值,因此您需要将其与某些内容进行比较。因此,如果您对使用案例感到不满,则必须进行比较。或者更新它以不使用像@mina这样的案例写道:
设置我们的测试数据
create table citizen (
id number,
country varchar2(100),
phone varchar2(10)
);
Table created.
insert into citizen values (10, 'Finland', '1234567890');
insert into citizen values (20, 'Ireland', 'abcdefghij');
尝试添加检查约束:
ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (CASE Country WHEN 'Finland' THEN REGEXP_LIKE(Phone,'^[0-9]{10}$') END );
*
ERROR at line 2:
ORA-00920: invalid relational operator
但是如果我们修改它来进行比较:
ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (case when country = 'Finland' and not REGEXP_LIKE(Phone,'^[0-9]{10}$') then 0 else 1 END);
Table altered.
然后我们可以测试它:
insert into citizen values (10, 'Finland', '123456789z');
ERROR at line 1:
ORA-02290: check constraint (CHECKPHONE) violated
insert into citizen values (100, 'Finland', '1234567890');
1 row created.