Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Порядок проверки ограничений  [new]
Lightnin Hopkins
Member

Откуда:
Сообщений: 80
Добрый день
Существует ли порядок проверки ограничений (constraints) на таблице Oracle.
Если вставляются данные, которые нарушают несколько ограничений, то
по какому из них будет выброшено исключение?

спасибо
2 сен 10, 10:00    [9368574]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Lightnin Hopkins
Добрый день
Существует ли порядок проверки ограничений (constraints) на таблице Oracle.
Если вставляются данные, которые нарушают несколько ограничений, то
по какому из них будет выброшено исключение?

спасибо

1) нет
2) по первому
2 сен 10, 11:32    [9369560]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Lightnin Hopkins,

Какую проблемы Вы пытаетесь решить?
2 сен 10, 11:46    [9369728]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
orawish

1) нет
2) по первому


А какой из них первый, если сортировки нет ? по первому попавшемуся?
Потестил. Похоже, что порядок по типам такой:
- cheсks
- primary key
- foreign keys

пытаюсь найти в доке ...

Но, действительно, интересно какая задача стоит у ТС?
2 сен 10, 12:48    [9370406]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
zhal
orawish

1) нет
2) по первому


А какой из них первый, если сортировки нет ? по первому попавшемуся?
Потестил. Похоже, что порядок по типам такой:
- cheсks
- primary key
- foreign keys

пытаюсь найти в доке ...

Но, действительно, интересно какая задача стоит у ТС?

управлять порядком исполнения проверок можно через отложенность
(DEFERRABLE-DEFERRED)
2 сен 10, 13:08    [9370602]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
collow
Member

Откуда:
Сообщений: 324
set echo on
create table test1 (
  x int,
  constraint test1_c1 check ( x > 10 ),
  constraint test1_c2 check ( x > 20 )
);
 
Table created
insert into test1 values ( 1 );
 
insert into test1 values ( 1 )
 
ORA-02290: check constraint (FLO.TEST1_C2) violated
drop table test1;
 
Table dropped
create table test1 (
  x int,
  constraint test1_c1 check ( x > 20 ),
  constraint test1_c2 check ( x > 10 )
);
 
Table created
insert into test1 values ( 1 )
drop table test1;
 
Table dropped
create table test1 (
  x int,
  constraint test1_c2 check ( x > 20 ),
  constraint test1_c1 check ( x > 10 )
);
 
Table created
insert into test1 values ( 1 );
 
insert into test1 values ( 1 )
 
ORA-02290: check constraint (FLO.TEST1_C1) violated
drop table test1;
 
Table dropped
2 сен 10, 13:19    [9370754]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
collow
Member

Откуда:
Сообщений: 324
Забыл ; на второй вставке - там выпало ORA-02290: check constraint (FLO.TEST1_C2) violated
Вывод - в обратном порядке создания.
2 сен 10, 13:20    [9370784]     Ответить | Цитировать Сообщить модератору
 Re: Порядок проверки ограничений  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
collow
Забыл ; на второй вставке - там выпало ORA-02290: check constraint (FLO.TEST1_C2) violated
Вывод - в обратном порядке создания.


Присоединен к:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> 
SQL> create table test1 (
  2    x int,
  3    constraint test1_c2 check ( x > 20 ),
  4    constraint test1_c1 check ( x > 10 )
  5  );

Таблица создана.

SQL> 
SQL> insert into test1 values ( 1 );
insert into test1 values ( 1 )
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(SCOTT.TEST1_C1)


SQL> alter table test1 drop constraint test1_c2;

Таблица изменена.

SQL> alter table test1 add constraint test1_c2 check ( x > 20 );

Таблица изменена.

SQL> alter table test1 add constraint test1_c2 check ( x > 30 );
alter table test1 add constraint test1_c2 check ( x > 30 )
                                 *
ошибка в строке 1:
ORA-02264: это имя уже используется в существующем ограничении


SQL> insert into test1 values ( 1 );
insert into test1 values ( 1 )
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(SCOTT.TEST1_C1)


SQL> 
SQL> drop table test1 purge;

Таблица удалена.

вывод: фигвам
2 сен 10, 14:22    [9371591]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить