Я думаю, что ваши отношения задом наперед.По сути, вы хотите, чтобы 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 не поддерживает проверочные ограничения, поэтому требуется триггер, чтобы гарантировать, что ровно один, а не оба идентификатора не равны нулю.