Могу ли я создать ограничения внешнего ключа от одного FK до нескольких PK - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время у меня есть two configuration tables, в котором хранятся два разных типа конфигураций, однако оба имеют столбец ID.У меня есть одна таблица под названием Deactivation.Любую конфигурацию, которую я хочу деактивировать, я могу добавить ID этой таблицы конфигурации в эту таблицу.

Структура базы данных следующая.

enter image description here

У меня вопрос: можно ли создать два ограничения FK, которые ссылаются на

- ID (FK) to T1_ID (PK)
- ID (FK) to T2_ID (PK)

(один ребенок на нескольких родителей)

Таким образом, в таблицу deactivation нельзя допускать вставку любых id, которых нет ни в T1, ни T2.Но если ID найдено в любой из этих таблиц, вставка должна быть сделана.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я думаю, что ваши отношения задом наперед.По сути, вы хотите, чтобы deactivations (или другая таблица) имели первичный ключ.Затем, это может быть разделено между другими таблицами:

create table deactivations (
     deactivationId int auto_increment primary key,
     . . .
);

create table config1 (
     config1Id int primary key,
     . . . 
     constraint fk_config1_config1Id foreign key (config1Id) references deactivations(deactivationId)
);

create table config2 (
     config2Id int primary key,
     . . . 
     constraint fk_config2_config2Id foreign key (config2Id) references deactivations(deactivationId)
);

Это не 100%, что вам нужно, потому что deactivationId может быть разделен между двумя таблицами.Есть способы обойти это, но, увы, в MySQL такая проверка требует триггеров.

Если вы все еще хотите использовать свое решение, вы можете использовать сгенерированный столбец:

create table deactivations (
    config1Id int,
    config2Id int,
    id int generated always as (coalesce(config1Id, config2Id)),
    constraint fk_deactivations_config1Id as foreign key (config1Id) references config1(config1Id),
    constraint fk_deactivations_config2Id as foreign key (config2Id) references config2(config2Id)
);

К сожалениюMySQL не поддерживает проверочные ограничения, поэтому требуется триггер, чтобы гарантировать, что ровно один, а не оба идентификатора не равны нулю.

0 голосов
/ 10 декабря 2018

Я думаю, что вы уже получили свой ответ из комментариев, но здесь как прямое утверждение:

Реляционные базы данных Механизм внешнего / первичного ключа не предназначен для поддержания и обеспечения такого рода отношений между таблицами.,Вам нужно будет сделать что-то нестандартное с триггером «Деактивации», который проверяет, что значение, вставляемое в «Деактивации», присутствует в T1 или T2, и разрешает вставку, если она есть / отклоняет ее, если нет.

Вам также придется подумать о кодировании чего-либо в T1 и T2, чтобы иметь дело с обновлениями / удаленными (каскадировать их?) И коллизиями (что если T1 id = 1 и T2 id = 2, но затем вы меняете T2 IDтакже должно быть 1? Что, если ID, присутствующий в T1, представляющий одну вещь, вставляется в T2, представляющую другую вещь? Новая вещь в T2 автоматически деактивируется? Мой телефон перестает работать, потому что кто-то перестал оплачивать свой контракт на своем планшете?)

...