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...
我该如何指定?
答案 0 :(得分:4)
我想这会更简单
alter table classname
add constraint check_room_no
check (SUBSTR(room_no, 1, 2) = 'LH');
答案 1 :(得分:3)
最简单的语法是:
alter table classname
add constraint check_room_no
check (room_no like 'LH%');
我更喜欢这种方法,因为如果你是在查询从LH开始的字符串那么你很可能会使用它,而不是使用SubStr()
答案 2 :(得分:2)
所有三种解决方案都很好。我创建了一个包含2亿行的测试表,并测量了添加检查约束所需的时间:
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'))
答案 3 :(得分: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'));