Как сделать проверочное ограничение, которое ссылается на два столбца? - PullRequest
1 голос
/ 03 марта 2020

Я хочу создать таблицу Sp в Oracle со следующим запросом:

create table SP(Order_date date ,Dely_date date  check(Dely_date>Order_date));

Но проблема в том, что oracle выдает ошибку «Ограничение проверки столбца не может ссылаться на другие столбцы»

Но если я создаю эту таблицу без этого условия check(Dely_date>Order_date), то таблица создается.

Скажите, почему проверочное ограничение не может работать с двумя столбцами.

Если я изменю таблицу SP с помощью этого условия check(Dely_date>Order_date)
, тогда мое проверочное ограничение будет работать правильно. Но во время создания проверочное ограничение не может работать с вышеуказанным условием.

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

В первой попытке вы пытаетесь создать ограничение inline . Нам разрешено ссылаться только на столбец-владелец во встроенном ограничении. Ваш оператор ALTER TABLE успешно выполняется, потому что он создает ограничение на уровне таблицы , а ограничения на уровне таблицы могут ссылаться более чем на один столбец.

Это дает нам подсказку, как исправить свой код, чтобы вы могли создать проверочное ограничение в операторе CREATE TABLE:

create table SP(Order_date date
               ,Dely_date  date 
               ,constraint dates_ck check(Dely_date > Order_date)
);

Обратите внимание на запятую перед ключевым словом constraint: это делает его ограничением на уровне таблицы (вне строки). Также обратите внимание, что я назвал ограничение dates_ck. Всегда полезно называть ограничения, но в этом случае это обязательно: мы не можем создать внешнее проверочное ограничение, не назвав его. (Попробуйте, и оно выдаст то же исключение ORA-02438.)

3 голосов
/ 03 марта 2020

Вот как Oracle сделал это - встроенное ограничение проверки не может ссылаться на другой столбец.

Обходной путь? Создать внешнее ограничение:

SQL> create table SP
  2    (Order_date date ,
  3     Dely_date  date,
  4     --
  5     constraint ch_date check (Dely_date > Order_date)
  6    );

Table created.

SQL>   insert into sp values (date '2020-03-03', date '2020-02-15');
  insert into sp values (date '2020-03-03', date '2020-02-15')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_DATE) violated


SQL>   insert into sp values (date '2020-03-03', date '2020-04-23');

1 row created.

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