繁体   English   中英

甲骨文的约束

[英]Constraint in oracle

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...

我应该如何指定呢?

我想这会更简单

alter table classname
     add constraint check_room_no 
      check (SUBSTR(room_no, 1, 2) = 'LH');

最简单的语法是:

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

我更喜欢这种方法,因为如果您要查询以LH开头的字符串,那么您很有可能会使用此方法,而不是SubStr()

三种解决方案都很好。 我创建了一个包含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'))

您应该使用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'));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM