将值插入表格

时间:2019-04-21 13:51:28

标签: sql oracle

我正在尝试将值插入到我创建的表中。

这是我表的属性和数据类型。

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|'));

它总是在正则表达式中说不匹配的括号

1 个答案:

答案 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)所有。