powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / forein key с кляузой on update set null: обломы, которых вроде как не должно быть
4 сообщений из 4, страница 1 из 1
forein key с кляузой on update set null: обломы, которых вроде как не должно быть
    #38539750
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Как-то странновато выглядит:
1) облом при on update set null, когда в соотв. поле мастер-таблицы вводится null-значение (да и не null тоже);
2) запрет установки FK на таблицу, если он ссылается строго на один столб, на который навешено UNIQUE-constraint, но допустимость этого же д-вия для двух столбов.

Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> recreate table tm(id int primary key, x int, y int,  constraint tm_xy_unq unique(x,y) ); commit;
SQL> recreate table td(id int primary key, px int, py int, constraint td_fk foreign key(px,py) references tm(x,y)  on update set null  on delete cascade);
SQL> insert into tm values(1, 100, 200);
SQL> insert into tm values(2, 300, 400);
SQL> commit;
SQL> insert into td values(1001, 100, 200);
SQL> insert into td values(1002, 100, 200);
SQL> insert into td values(1003, 100, 200);
SQL> insert into td values(1004, 100, 200);
SQL> commit;

SQL>  update tm set x=null where id=1; 
Statement failed, SQLSTATE = 23000
violation of FOREIGN KEY constraint "TD_FK" on table "TD"
-Foreign key references are present for the record
-Problematic key value is ("X" = 100, "Y" = 200)

SQL>  update tm set x=null, y=null where id=1; 
Statement failed, SQLSTATE = 23000
violation of FOREIGN KEY constraint "TD_FK" on table "TD"
-Foreign key references are present for the record
-Problematic key value is ("X" = 100, "Y" = 200)

И в то же время, когда ссылка идёт на один столбец, являющийся PK, - всё пучком:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> recreate table tm2(id int primary key);
SQL> recreate table td2(id int primary key, pid int references tm2 on update set null on delete cascade);
SQL> insert into tm2 values(1);
SQL> insert into tm2 values(2);
SQL> insert into td2 values(100,1);
SQL> insert into td2 values(101,1);
SQL> insert into td2 values(102,1);
SQL> commit;
SQL>  update tm2 set id=-1 where id=1; 
SQL> select * from td2;
-- OK:
          ID          PID
============ ============
         100       <null>
         101       <null>
         102       <null>

А вот если ссылочный столб является UNIQUE (НЕ PK), то снова облом, но уже другой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> recreate table tm3(id int  unique );
SQL> recreate table td3(id int primary key, pid int references tm3 on update set null on delete cascade);
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
-RECREATE TABLE TD3 failed
-SQL error code = -607
-Invalid command
-"REFERENCES table" without "(column)" requires PRIMARY KEY on referenced table
...
Рейтинг: 0 / 0
forein key с кляузой on update set null: обломы, которых вроде как не должно быть
    #38539752
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидА вот если ссылочный столб является UNIQUE (НЕ PK), то снова облом, но уже другойпардон, этот вопрос - бред. Нечитатель self-detected.
Надо вот так:
recreate table td3(id int primary key, pid int references tm3 (id) on update set null on delete cascade);
...
Рейтинг: 0 / 0
forein key с кляузой on update set null: обломы, которых вроде как не должно быть
    #38539756
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

и как ты только до таких извращений додумался...

ТаблоидА вот если ссылочный столб является UNIQUE (НЕ PK), то снова облом, но уже другой:
SQL> recreate table tm3(id int unique);
SQL> recreate table td3(id int primary key, pid int references tm3 on update set null on delete cascade);

А если сделать вот так
Код: sql
1.
recreate table tm3(id int unique not null);
...
Рейтинг: 0 / 0
forein key с кляузой on update set null: обломы, которых вроде как не должно быть
    #38539759
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениси как ты только до таких извращений додумался...Да вспомнилось тут, на сон грядущий, что ломал вроде FK, только это было в каком-то раннем 2.5. Но не могу найти ни у себя, ни тут.
Вот и решил поиздевацца немного над трёшкой - вдруг да получится по-быстрому, "на халяву" проскочить :-)

Симонов ДенисА если сделать вот такне, тоже облом. там обязательно надо имя столба указать, если это не ПК.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / forein key с кляузой on update set null: обломы, которых вроде как не должно быть
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]