2015-03-08 3 views
0

Возможно ли иметь внешний ключ (InnoDB) ссылку на две возможные таблицы?Внешняя ссылка referenceA.column или tableB.column

Если нет, есть ли обходной путь для этого?

Существует два разных объекта, которые содержат одно и то же поле (interface_id). Третья таблица ссылается на это поле.

Примером являются:

physical_interface (id, name, etc) 
virtual_interface (id, name, etc) 
usage (interface_id, etc) 

У меня была идея использовать вид, но наткнулся на это связано с сервером SQL: Can I have a foreign key referencing a column in a view in SQL Server? так кажется, что вы не можете использовать представления в внешних ключей.

Альтернатива, я полагаю, будет хранить все ожидания в одном столе, но я чувствую, что это будет менее организованной.

ответ

0

Ну, ответ интересный. MySQL 5.6.14, моя версия не остановит вас от создания отношения внешнего ключа с двумя таблицами, но это плохая идея. Позвольте мне показать вам, почему.

Создание 2 мастер-таблицы: test1 и test3

create table test1 (field1 int, primary key (field1)); 
create table test3 (field1 int, primary key (field1)); 

Создать зависимую таблицу, которая будет иметь FK отношения с field1 обеих таблиц.

create table test2 (
    field0 int, 
    field1 int, 
    constraint fk_test2_test1 
    foreign key (field1) 
    references test1 (field1), 
    constraint fk_test2_test3 
    foreign key (field1) 
    references test3 (field1) 
); 

Отлично. Теперь добавим некоторые данные и посмотрим на проблему:

insert into test1 values (1); 
insert into test3 values (3); 

Мастер-таблицы выполнены. Давайте добавим данные в зависимую таблицу.

insert into test2 values (100, 1); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`test2`, CONSTRAINT `fk_test2_test3` FOREIGN KEY (`field1`) REFERENCES `test3` (`field1`)) 

insert into test2 values (100, 3); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`test2`, CONSTRAINT `fk_test2_test1` FOREIGN KEY (`field1`) REFERENCES `test1` (`field1`)) 

insert into test2 values (100, 2); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`test2`, CONSTRAINT `fk_test2_test1` FOREIGN KEY (`field1`) REFERENCES `test1` (`field1`)) 

Так что ... не делайте этого.

Предложение

create table interface_type (
    id int auto_increment, 
    type_name varchar(30), 
    primary key (id) 
); 

create table interface (
    id int auto_increment, 
    interface_name varchar(30), 
    interface_type int, 
    primary key (id), 
    constraint fk_interface_type 
    foreign key (interface_type) 
    references interface_type (id) 
); 

create table `usage` (
    id int auto_increment, 
    interface_id int, 
    primary key (id), 
    constraint fk_usage_interface 
    foreign key (interface_id) 
    references interface (id) 
); 

Теперь вы можете добавить различные типы интерфейсов в interface_type таблицы, такие как:

insert into interface_type (type_name) values ('physical'), ('virtual'); 

Затем добавьте столько интерфейсов, которые вы хотели бы в interface, а также указать их в таблице usage при необходимости.

Смежные вопросы