Невозможно заставить канадский почтовый индекс работать и все заглавные буквы провинции - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь запустить мой код PL/SQL, но у меня постоянно возникают проблемы.Я пытаюсь, чтобы мой канадский почтовый индекс был действительным, и он продолжает выдавать ошибку SQL Ошибка: ORA-02290: проверено ограничение проверки (ORCL2_21.CK_INVESTOR_POSTAL_CODE), и провинция должна быть двумя символами, и все заглавные буквы могут быть действительными, и этоне скомпилирует тестовый код, который у меня есть.

Create table Investor
(
  Investor_Number Number(7,0)
      Constraint PK_Investor_Investor_Number Primary Key
      Constraint NN_Investor_Investor_Number Not Null,
  First_Name Varchar2(25)
      Constraint NN_Investor_First_Name Not Null,
  Last_Name Varchar2(30)
      Constraint NN_Investor_Last_Name Not Null,    
  Street_Address Varchar2(35)
      Constraint NL_Investor_Street_Address Null,
  City Varchar2(25)
      Constraint NL_Investor_City Null,
  Province Char(2)
      Constraint CK_Investor_Province Check (Province in ('__'))
      Constraint CK_Investor_Province_Caps Check (Province = UPPER(province))
      Constraint NL_Investor_Province Null,
 Postal_Code Varchar2(7)
          Constraint CK_Investor_Postal_Code Check (REGEXP_like(Postal_Code,'[A-Z][0-9][A-Z][0-9][A-Z][0-9]')) --Having problem getting postal code to work on test inserts code!!!!!!
          Constraint NL_Investor_Postal_Code Null,
  Area_Code Number(3,0)
      Default '780'
      Constraint NN_Investor_Area_Code Not Null,
  Phone_Number Number(7,0) 
      Constraint NN_Investor_Phone_Number Not Null,
   Email_Address Varchar2(50)
      Constraint CK_Investor_Email_Address Check (REGEXP_LIKE (email_address, '^(\S+)\@(\S+)\.(\S+)$'))
      Constraint NN_Investor_Email_Address Not Null,
  Account_Number Number(7,0) Not Null,
      Constraint FK__Investor_Account_Number --Name of Constraint
      Foreign Key (Account_Number) -- Foreign Key Column name
      References Account(Account_Number)-- name of table and column trying to reference,
  );

Вот инструкция вставки, которая не соответствует ограничению.

INSERT INTO Investor (Investor_Number, First_Name, Last_Name, Street_Address, City, Province, Postal_Code, Area_Code, Phone_Number, Email_Address, Account_Number) 
VALUES (1004, 'Tobias', 'Schneider', '10222 102 ST', 'Edmonton', 'AB', 'T5P 1W1', 780, 4997766, 'pellentesque@freenet.com', 7200); 

Выдает ошибку SQL:

ORA-02290: проверка ограничения (ORCL2_21.CK_INVESTOR_POSTAL_CODE) нарушена

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Задание ограничения NULL просто бесполезно .По умолчанию в столбце допускаются пустые значения, поэтому - нет смысла это делать.

Вы сказали, что у вас проблемы с CK_INVESTOR_POSTAL_CODE;Я не:

SQL> create table investor
  2  ( Postal_Code Varchar2(7)
  3            Constraint CK_Investor_Postal_Code Check
  4            (REGEXP_like(Postal_Code,'[A-Z][0-9][A-Z][0-9][A-Z][0-9]'))
  5            --Having problem getting postal code to work on test inserts code!!!!!!
  6  );

Table created.

SQL> insert into investor values ('A1B2C3');

1 row created.

SQL> insert into investor values ('abcdef');
insert into investor values ('abcdef')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CK_INVESTOR_POSTAL_CODE) violated


SQL> insert into investor values ('123');
insert into investor values ('123')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CK_INVESTOR_POSTAL_CODE) violated


SQL> insert into investor values ('AAABBB');
insert into investor values ('AAABBB')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CK_INVESTOR_POSTAL_CODE) violated


SQL>

Без предоставления того, что вы сделали (т.е. какие значения вы пытались вставить в таблицу), трудно догадаться, что не так.

0 голосов
/ 16 сентября 2018

Ваш пример почтового индекса 'T5P 1W1'. Ваше регулярное выражение содержит только буквы и цифры и не допускает пробелов. Так что либо:

  • вам нужно изменить значение почтового индекса, чтобы оно было 'T5P1W1' или
  • вам нужно изменить регулярное выражение, чтобы включить пробел, например, (REGEXP_like(Postal_Code,'[A-Z][0-9][A-Z] [0-9][A-Z][0-9]'))
0 голосов
/ 15 сентября 2018

Во-первых, непонятно, что означает «неправильно понять».Вы получаете ошибку или что-то?Если это так, это помогает точно показать, какую ошибку вы получаете.

Во-вторых, это работает для меня, в том смысле, что я могу создать таблицу после снятия ограничения FK для account_number, просто потому, что я неэтой таблицы нет.

В-третьих, у вас есть несколько ограничений NULL, но я предполагаю, что они должны быть NOT NULL.В противном случае они не имеют смысла.

В-четвертых, province не должно быть IN, но, вероятно, LIKE.

Я не знаю, как выглядят канадские почтовые индексы.Является ли A0A0A0 действительным почтовым индексом?

Лично я бы избавился от CHAR и использовал бы вместо него VARCHAR2.Просто никогда не используйте CHAR.Если ваша база данных UTF-8, я бы также указал столбцы с типом длины, например VARCHAR2(25 CHAR).

Редактировать: В вашем почтовом коде есть пробел, но вашрегулярное выражение не позволяет им.Вы можете сделать это '[A-Z][0-9][A-Z] [0-9][A-Z][0-9]' с пробелом между третьим и четвертым жетонами ..

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