外键引用table.column或table.column

时间:2015-03-08 02:57:04

标签: mysql foreign-keys innodb

是否可以使用外键(InnoDB)引用两个可能的表?

如果没有,是否有针对此的解决方法?

有两个不同的主题包含相同的字段(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?所以看起来你不能在外键中使用视图。

我认为,替代方案是将所有接口存储在一个表中,但我觉得这样会更有条理。

1 个答案:

答案 0 :(得分:0)

嗯,答案很有趣。 MySQL 5.6.14,我的版本,不会阻止你创建与2个表的外键关系,但这是一个坏主意。让我告诉你原因。

创建2个主表:test1和test3

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

创建一个与两个表的field1具有FK关系的从属表。

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表中引用它们。