检查约束last_name大写

时间:2016-04-12 14:29:15

标签: sql oracle

如何制作检查约束,检查last_name是否有最后2个字母大写?

alter table clienti modify (nume_client constraint che_d check(nume_client=upper(substr(nume_client, -2, 1))));

我确实喜欢这个,但是我收到了以下错误:

  
      
  1. 00000 - "无法验证(%s。%s) - 检查违反约束"
  2.   

3 个答案:

答案 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)。但正确的语法将使您走上正确的道路。