Как добавить Oracle SQL Constraint с 2 условиями с операцией ИЛИ - PullRequest
0 голосов
/ 07 октября 2019

Я работаю с oracle sql и хочу добавить ограничение на столбец, чтобы значения в этом столбце были включены в набор значений, или он может быть нулевым

Я использовал следующий DDLоператор, но он не работает

ALTER TABLE CAR 
ADD CONSTRAINT COLOR_CHECK
CHECK (COLOR IS NULL OR COLOR IN ('RED' , 'BLUE' , 'YELLOW' , 'GREEN'));

Я получаю следующую ошибку, в то время как значения в столбце «КРАСНЫЙ», «СИНИЙ», «ЖЕЛТЫЙ», «ЗЕЛЕНЫЙ» и (ноль)

"cannot validate (%s.%s) - check constraint violated"
*Cause:    an alter table operation tried to validate a check constraint to
           populated table that had nocomplying values.

Как я могу исправить инструкцию DDL, чтобы применить требуемое действие?

1 Ответ

2 голосов
/ 07 октября 2019

Пример таблицы и несколько строк:

SQL> create table car (name varchar2(20), color varchar2(10));

Table created.

SQL> insert into car (name, color)
  2    select 'BMW', 'RED' from dual union all
  3    select 'Opel', null
  4  from dual;

2 rows created.

Добавить ограничение:

SQL> alter table car add constraint ch_col check (color in ('RED', 'BLUE'));

Table altered.

Тестирование:

SQL> -- Fail, because GREEN isn't allowed
SQL> insert into car (name, color) values ('Mercedes', 'GREEN');
insert into car (name, color) values ('Mercedes', 'GREEN')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_COL) violated


SQL> -- OK, as BLUE is allowed
SQL> insert into car (name, color) values ('Mercedes', 'BLUE');

1 row created.

SQL> -- OK, as no color is allowed
SQL> insert into car (name, color) values ('Jaguar', null);

1 row created.

SQL> -- Table contents
SQL> select * From car;

NAME                 COLOR
-------------------- ----------
BMW                  RED
Opel
Mercedes             BLUE
Jaguar

SQL>

Это то, что - япредположите - у вас есть:

SQL> -- Drop constraint
SQL> alter table car drop constraint ch_col;

Table altered.

SQL> -- Insert another "red" (note lower case) car
SQL> insert into car (name, color) values ('Ford', 'red');

1 row created.

SQL> -- Reinforce the constraint
SQL> alter table car add constraint ch_col check (color in ('RED', 'BLUE'));
alter table car add constraint ch_col check (color in ('RED', 'BLUE'))
                               *
ERROR at line 1:
ORA-02293: cannot validate (SCOTT.CH_COL) - check constraint violated


SQL>

Wooops! Там что-то не так.

Я предлагаю вам сначала выполнить следующий выбор, чтобы найти строки, которые неправильны (я имею в виду, которые мешают вам создать ограничение):

SQL> select color, count(*) from car group by color;

COLOR        COUNT(*)
---------- ----------
                    2
RED                 1
red                 1        --> ah, "red"!
BLUE                1

SQL>

Затем исправьте данные и создайте ограничение:

SQL> update car set color = upper(color);

5 rows updated.

SQL> alter table car add constraint ch_col check (color in ('RED', 'BLUE'));

Table altered.

SQL>
...