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 应始终包含“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

这三个解决方案都很好。我创建了一个包含 200 万行的测试表,并测量了添加检查约束所需的时间:

 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 回答