2 foreign key на одном поле
От: Аноним  
Дата: 11.01.20 12:14
Оценка: 10 (1)
Всегда думал, что на одном поле таблицы БД может быть только один внешний ключ. Но недавно встретил вот такое определение таблицы в postgresql и был немного обескуражен.
alter table public.Roles
   add constraint fk_roles_types foreign key (typeId)
      references public.RoleTypes (Id)
      on delete restrict on update restrict;

alter table public.Roles
   add constraint fk_roles_types2 foreign key (typeId)
      references public.RoleTypes (Id)
      on delete restrict on update cascade;

Как такое возможно? Как это вообще работает, какое ограничение в итоге будет работать. Может кто-нибудь сталкивался и подскажет (ничего что-то не смог нагуглить по этому вопросу, на SO также глухо).
Re: 2 foreign key на одном поле
От: Pavel Dvorkin Россия  
Дата: 11.01.20 12:54
Оценка: 80 (2)
Здравствуйте, Аноним, Вы писали:

А>Как такое возможно? Как это вообще работает, какое ограничение в итоге будет работать. Может кто-нибудь сталкивался и подскажет (ничего что-то не смог нагуглить по этому вопросу, на SO также глухо).


Проверил для MySQL

1. Возможно
2. Можно даже без ALTER TABLE, просто 2 CONSTRAINT — FOREIGN KEY в CREATE TABLE
3. Срабатывает ON DELETE CASCADE. ON UPDATE не проверял
With best regards
Pavel Dvorkin
Отредактировано 11.01.2020 13:15 Pavel Dvorkin . Предыдущая версия . Еще …
Отредактировано 11.01.2020 13:03 Pavel Dvorkin . Предыдущая версия .
Re[2]: 2 foreign key на одном поле
От: Pavel Dvorkin Россия  
Дата: 13.01.20 15:56
Оценка:
Судя по всему, имеет место вот что

Поля, входящие в FK, образуют некий набор, к которому привязывается Set<Action>.

Action — это ON DELETE (CASCADE, RESTRICT, SET NULL) или ON UPDATE то же

Если появляется описание нового FK с теми же полями, то делается попытка добавить в этот Set новый Action. Если этот новый Action не противоречит тем, что уже есть в Set, то он добавляется, но по принципу Set. Если противоречит — отвергается.

Поэтому можно сделать несколько FK с одним и тем же набором полей и во всех написать ON DELETE CASCADE, но добавить еще один FK с ON DELETE SET NULL не удастся.

RESTRICT (или пусто) как Action не рассматривается и не мешает добавлению.

Все это лишь моя гипотеза, не более.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.