是否可以使用外键(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?所以看起来你不能在外键中使用视图。
我认为,替代方案是将所有接口存储在一个表中,但我觉得这样会更有条理。
答案 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
表中引用它们。