2016-04-12 30 views
0

last_nameに最後の2文字が大文字になっているかどうかをチェックする検査制約を作成するにはどうすればよいですか?チェック制約last_name大文字

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

私はこのようでしたが、私は次のエラーを取得しています:

  1. 00000 - "cannot validate (%s.%s) - check constraint violated"
+0

'substr(nume_client、-2、1)= upper(substr(nume_client、-2、1))'? – jarlh

答えて

3

制約条件では、全体の名前と大文字の第2文字の大文字とを比較しています。 third argumentsubstring_lengthを1に指定しているため、1文字しか表示されません。最後の2文字を確認する必要があります。あなたが大文字で同じ2つの文字でのみを比較する必要があります:あなたが追加しようとしている制約を満たしていないデータを既存しているので、

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

これは、チェック制約を追加するための構文は次のとおりです。

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

私はかなり確信していますロジックは何も役に立ちません(私はこれが常にfalseを返すと確信しています)。しかし、正しい構文で正しいパスを得ることができます。

2

テーブルにレコードがあり、チェック制約に合格していない可能性があります。将来のトランザクションに対してのみチェックを行うことができれば、NOVALIDATE節を制約に使用できます。例えば。

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 
+0

彼は最後の2つのチャレクタを大文字にしたいと思っています。あなたのケースでは 'INSERT INTO names VALUES( 'SkywalkEr'); –