我正在尝试在表中使用REGEXP_LIKE来检查游戏的分数是否具有以下模式:
(1或2个数字)x(1或2个数字)
我试图使用此表达式
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]+x[[:digit:]]+$', 'i'))
但是我无法插入类似“ 1x0”的分数。我还尝试了其他一些选择,例如:
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]{1,2}x[[:digit:]]{1,2}$', 'i'));
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]*[[:digit:]]x[[:digit:]][[:digit:]]*$', 'i'));
我也尝试将[[:digit:]]更改为[0-9],但是它也不起作用。
这是我完整的表格:
CREATE TABLE PARTIDA (
TIME1 VARCHAR2(50) NOT NULL,
TIME2 VARCHAR2(50) NOT NULL,
DATA DATE NOT NULL,
PLACAR CHAR(5) DEFAULT '0x0',
LOCAL VARCHAR2(50) NOT NULL,
CONSTRAINT PK_PARTIDA PRIMARY KEY (TIME1, TIME2, DATA),
CONSTRAINT FK_PARTIDA FOREIGN KEY (TIME1, TIME2) REFERENCES JOGA(TIME1, TIME2),
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]+x[[:digit:]]+$', 'i'))
);
这是我的测试用例:
INSERT INTO PARTIDA VALUES ('TIME1', 'TIME2', SYSDATE, '1x0', 'ESTADIO1');
以下是输出:
从第1行开始的错误- 插入PARTIDA值('TIME1','TIME2',SYSDATE,'1x0','ESTADIO1') 错误报告 - ORA-02290:违反了检查约束(K9012931.CK_PLACAR)
答案 0 :(得分:1)
在{x1的两边,尝试'^\d{1,2}x\d{1,2}$'
至少输入1位,但不要超过2位。
也许是语法?试试这个:
ALTER TABLE score_table ADD (
CONSTRAINT CK_PLACAR
CHECK (REGEXP_LIKE (PLACAR, '^\d{1,2}x\d{1,2}$', 'i'))
ENABLE VALIDATE);
编辑感谢kfinity的上述评论。使用具有CHAR(5)数据类型的PLACAR时,这是固定宽度的数据类型,因此,如果输入的数据少于5个字符,则会填充空格,导致其与正则表达式模式不匹配。要么将数据类型更改为可变宽度且首选的VARCHAR2(5),要么更改正则表达式以使结尾处可能有零个或多个空格:
'^\d{1,2}x\d{1,2} *$'
答案 1 :(得分:0)
就像Gary W的答案一样,您也可以对其进行修改,使其不接受像'0x'(01,02,03,...)之类的分数,而是接受0或仅接受1,2,3等。
^(?!0\d)\d{1,2}x(?!0\d)\d{1,2}$