Вставка значений в таблицы - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь вставить значения в созданную мной таблицу.

Это атрибуты и типы данных для моей таблицы.

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 голосов
/ 21 апреля 2019

Я пытаюсь использовать [почтовый] формат, такой как L9L9L9

Так что это регулярное выражение '([A-Z][0-9]){3}'.

номер телефона должен быть отформатирован как 999.999.9999

В вашем регулярном выражении есть начальная цифра, которую нужно удалить.Регулярное выражение должно быть '([0-9]){3}[.]([0-9]){3}[.]([0-9]){4}'

После того, как вы исправите это, есть также проблема с PROV.Я обрезал каналы от этого регулярного выражения, и теперь ваши операторы вставки вставляются аккуратно. Вот демонстрационная программа SQL Fiddle .

Окончательная (?) Правильная версия:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...