我正在尝试将值插入到我创建的表中。
这是我表的属性和数据类型。
CREATE TABLE DDR_Customer
(customer_name VARCHAR2(30),
customer_ID NUMBER(5),
city VARCHAR2(20),
street VARCHAR2(20),
prov CHAR(2),
postal_code VARCHAR2(6),
phone_number VARCHAR2(15),
email VARCHAR2(50),
credit_number VARCHAR2(20),
credit_type VARCHAR2(2),
credit_card_expiry VARCHAR2(15));
这是我正在尝试的插入命令。
VALUES ('Max Lu', 12345, 'Calgary', '9 Street', 'AB', 'L9L9L9', '403.892.8677', 'Jennalee@gmail.com', '4324 2424 2222 2222', 'AX', '10 Dec 19');
这也是我的约束。
ALTER TABLE DDR_Customer
ADD CONSTRAINT SYS_CUSTOMER_CUS_ID_PK PRIMARY KEY (customer_ID)
MODIFY (customer_name CONSTRAINT CUSTOMER_FIRST_NAME_NN NOT NULL )
ADD CONSTRAINT SYS_CUSTOMER_PROV_CK CHECK (REGEXP_LIKE (prov, '|AB|BC|MB|NB|
NL|NS|NT|NU|ON|PE|QC|SK|YT|'))
ADD CONSTRAINT SYS_CUSTOMER_POSTAL_CK CHECK (REGEXP_LIKE(postal_code,'([A-Z][0-9]){3}[0-9][A-Z]){3}'))
ADD CONSTRAINT SYS_CUSTOMER_PHONE_CK CHECK (REGEXP_LIKE(phone_number,'[1-9]([0-9]){3}[.]([0-9]){3}[.]([0-9]){4}'))
ADD CONSTRAINT SYS_CUSTOMER_EMAIL_UK UNIQUE (email)
ADD CONSTRAINT SYS_CUSTOMER_CARD_NUM_CK CHECK (REGEXP_LIKE(credit_number,'[0-9]{4}[ ][0-9]{4}[ ][0-9]{4}[ ][0-9]{4}'))
ADD CONSTRAINT SYS_CUSTOMER_CARD_TYPE_CK CHECK (REGEXP_LIKE (credit_type,'|MC|VS|AX|'));
它总是在正则表达式中说不匹配的括号
答案 0 :(得分:0)
我正在尝试强制使用L9L9L9之类的[邮政]格式
因此,这是'([A-Z][0-9]){3}'
的正则表达式。
电话号码的格式应为999.999.9999
您的正则表达式是您需要删除的前导数字。正则表达式应为'([0-9]){3}[.]([0-9]){3}[.]([0-9]){4}'
一旦您修复了PROV也会出现的问题。我修剪了该正则表达式中的管道,现在您的insert语句可以干净地插入。 Here is a SQL Fiddle demo。
最终(?)正确版本:
ALTER TABLE DDR_Customer
ADD CONSTRAINT SYS_CUSTOMER_CUS_ID_PK PRIMARY KEY (customer_ID)
MODIFY (customer_name CONSTRAINT CUSTOMER_FIRST_NAME_NN NOT NULL )
ADD CONSTRAINT SYS_CUSTOMER_PROV_CK CHECK (REGEXP_LIKE (prov, 'AB|BC|MB|NB|
NL|NS|NT|NU|ON|PE|QC|SK|YT'))
ADD CONSTRAINT SYS_CUSTOMER_POSTAL_CK CHECK (REGEXP_LIKE(postal_code,'([A-Z][0-9]){3}'))
ADD CONSTRAINT SYS_CUSTOMER_PHONE_CK CHECK (REGEXP_LIKE(phone_number,'([0-9]){3}[.]([0-9]){3}[.]([0-9]){4}'))
ADD CONSTRAINT SYS_CUSTOMER_EMAIL_UK UNIQUE (email)
ADD CONSTRAINT SYS_CUSTOMER_CARD_NUM_CK CHECK (REGEXP_LIKE(credit_number,'[0-9]{4}[ ][0-9]{4}[ ][0-9]{4}[ ][0-9]{4}'))
ADD CONSTRAINT SYS_CUSTOMER_CARD_TYPE_CK CHECK (REGEXP_LIKE (credit_type,'MC|VS|AX'));
顺便说一句,我认为过度使用正则表达式是一件坏事。与内置SQL函数相比,它们的性能较差。例如,对字符串的检查约束应实现为简单的IN子句:
ADD CONSTRAINT SYS_CUSTOMER_CARD_TYPE_CK CHECK (credit_type in ('MC','VS','AX'))
,甚至作为查找表上的外键。
我有点担心您的约束以SYS_开头。这是为什么?它们是用户定义的约束。我确实希望这并不意味着该表归SYSTEM(甚至更糟糕的SYS)所有。