1
CREATE TABLE classname (
class_name VARCHAR2(5) CONSTRAINT class_name_pk PRIMARY KEY,
meet_at_and_timing VARCHAR2(30),
room_no VARCHAR2(5),
faculty_handling NUMBER(5) CONSTRAINT faculty_handling_fk REFERENCES faculty(faculty_id)
);

上記のテーブルの作成では、room_number の最初の 2 文字は常に「LH」である必要があります。

例:

room_no=LH43 is valid but room_no=EC43 is invalid...

これはどのように指定すればよいですか?

4

4 に答える 4

4

もっとシンプルになると思います

alter table classname
     add constraint check_room_no 
      check (SUBSTR(room_no, 1, 2) = 'LH');
于 2013-01-10T13:18:38.580 に答える
3

最も単純な構文は次のとおりです。

alter table classname
 add constraint check_room_no 
  check (room_no like 'LH%');

LH で始まる文字列をクエリする場合、SubStr() ではなくこれを使用する可能性が高いため、私はこの方法を好みます。

于 2013-01-10T14:22:34.167 に答える
2

All three solutions are good. I've created a test table with 200 millon rows and measured the time it takes to add a check constraint:

 36.4s  0.17 us   CHECK (room_no LIKE 'LH%')
 54.2s  0.26 us   CHECK (substr(room_no,1,2) = 'LH') 
111.9s  0.54 us   CHECK (REGEXP_LIKE(room_no, '^LH', 'c'))
138.3s  0.66 us   CHECK (REGEXP_LIKE(room_no, '^LH', 'i'))
于 2013-01-10T14:24:58.993 に答える
1

REGEXP_LIKE を使用する必要があります。「LH」を大文字にしたい場合は、REGEXP_LIKE で大文字と小文字を区別するように指定する必要があります。

alter table classname
     add constraint check_room_no 
      check (REGEXP_LIKE(room_no,'your_regex_goes_here','C'));

次に、たとえばhttp://www.gskinner.com/RegExr/で遊んで、制約の正規表現が何であるかを理解します。

例 :

 alter table classname
    add constraint check_room_no 
      check (REGEXP_LIKE(room_no,'^LH\w','C'));
于 2013-01-10T12:44:01.797 に答える