如何制作检查约束,检查last_name是否有最后2个字母大写?
alter table clienti modify (nume_client constraint che_d check(nume_client=upper(substr(nume_client, -2, 1))));
我确实喜欢这个,但是我收到了以下错误:
- 00000 - "无法验证(%s。%s) - 检查违反约束"
醇>
答案 0 :(得分:3)
您的约束是将整个名称与大写倒数第二个字符进行比较。它只查看一个字符,因为您提供的third argument substring_length
为1.您需要检查最后两个字符;所以你只需要比较大写相同的两个字符:
substr(nume_client, -2) = upper(substr(nume_client, -2))
您获得的错误是因为您的现有数据不符合您尝试添加的约束。这可能是因为你的约束并没有按照你的意图行事,因为它在原始版本中总是会返回false。
如果修改后的检查出现相同的错误,则需要在添加约束之前删除或更正该数据,或者使用the novalidate
clause:
check (substr(nume_client, -2) = upper(substr(nume_client, -2))) novalidate
任何现有的违反约束的行都将保持不变,但您无法添加违反约束的新行,或者将现有行更新为仍然无效的值。
您可以使用alter table modify (column...)
语法,或者更简单的语法,Gordon Linoff表示;他们最终做同样的事情。
答案 1 :(得分:2)
您可能已在表中有记录,但未传递检查约束。如果可以仅对将来的事务进行检查,则可以使用NOVALIDATE子句进行约束。 E.g。
CREATE TABLE names (last_name VARCHAR2(100));
--Table created
INSERT INTO names VALUES ('Rambo');
--1 row inserted
INSERT INTO names VALUES ('GatES');
--1 row inserted
alter table names add constraint chk_che_d
check (SUBSTR(last_name,-2,1) = upper(substr(last_name, -2, 1))) NOVALIDATE;
--Table altered
INSERT INTO names VALUES ('Travolta');
--ORA-02290: check constraint (RO.CHK_CHE_D) violated
INSERT INTO names VALUES ('SkywalkER');
--1 row inserted
答案 2 :(得分:1)
这是添加检查约束的语法:
alter table clienti add constraint chk_che_d
check (nume_client = upper(substr(nume_client, -2, 1)));
我很确定逻辑没有做任何有用的事情(我很确定这总是会返回false)。但正确的语法将使您走上正确的道路。