7

Oracle 11gを使用していて、作成時に制約を定義するテーブルを作成しようとしています。

いくつかの情報(電子メールアドレス、電話番号など)を検証するためにチェック制約を追加しようとしていました。

Oracle 11gに、このようなことを可能にする何かがありますか?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX')

私が使用したかった正規表現(regexLibから取得)は次のとおりです。

^[a-zA-Z][a-zA-Z0-9_\.\-]+@([a-zA-Z0-9-]{2,}\.)+([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$

Oracle 11g(間違っている場合は訂正してください)は、正規表現のこの形式をサポートしていないと思います...

REGEX_LIKEを使用するメソッドを見たことがありますが、これはWHERE句でのみ機能するようです。

トリガーや外部関数/スクリプトではなく、チェック制約として保持したいと思います。

また、私はここで他のスレッドを読んだことがありますが、「正規表現」は電子メールアドレスの形式やそのような情報を確認する良い方法ではないと言う人がいます。コメントには理由が記載されていませんが、理由があればその理由を知りたいです!

4

2 に答える 2

19

チェック制約は、WHERE句の条件と同じ構文規則に従います。

alter table foo
  add constraint check_email 
  check (REGEXP_LIKE(email,'your_regex_goes_here','I')); 

マニュアルの詳細:

編集:

ただし、チェック制約で実際に使用できるものにはいくつかの制限があります。

于 2011-10-01T17:12:44.450 に答える
0
CREATE TABLE MYTABLE(
  EMAIL VARCHAR2(30) CHECK(REGEXP_LIKE (EMAIL,'^[A-Za-z]+[A-Za-z0-9.]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'))
);

ALTER TABLE MYTABLE ADD(CONTACT NUMBER(10) CHECK(REGEXP_LIKE(CONTACT,'[0-9]{10}')));


Explanation of Regular Expression
^           #start of the line
  [_A-Za-z0-9-]+    #  must start with string in the bracket [ ], must contains one or more (+)
  (         #  start of group #1
    \\.[_A-Za-z0-9-]+   #     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
  )*            #  end of group #1, this group is optional (*)
    @           #     must contains a "@" symbol
     [A-Za-z0-9]+       #        follow by string in the bracket [ ], must contains one or more (+)
      (         #      start of group #2 - first level TLD checking
       \\.[A-Za-z0-9]+  #        follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*        #      end of group #2, this group is optional (*)
      (         #      start of group #3 - second level TLD checking
       \\.[A-Za-z]{2,}  #        follow by a dot "." and string in the bracket [ ], with minimum length of 2
      )         #      end of group #3
$           #end of the line
于 2019-08-28T18:07:30.803 に答える