我有以下问题。我的表结构是这样的:
//table1
id
name
//table2
id
name
//mastertable
id
table1_id
table2_id
并且mastertable
具有table1
和table2
的外键,但只能在每一行中使用它们中的任何一个,而另一个将是{{1 }}。
问题是,行中不能有重复项,例如:
NULL
但是MySQL确实允许这样做,因为我在{ table1_id: 1, table2_id: NULL}
{ table1_id: 1, table2_id: NULL}
上使用了NULL
值。而且我需要这两个列可以为空,否则我就不能在它们上有外键(例如,如果我使用0而不是table2_id
)。
有什么办法解决这个问题?
编辑:如果不清楚,则该表已经具有NULL
和table1_id
的唯一键。
另一项编辑:我正在考虑将唯一键分为两部分,每张表一个。那行吗,还是以后会再次咬我?
答案 0 :(得分:0)
您是否尝试过多列索引?
如果不行,则另一种解决方案(最可靠的方法)是让脚本检查行是否存在。使用它也没错。
答案 1 :(得分:0)
您可以在masterable中添加一个额外的列,该列将是使用table1_id
和table2_id
生成的唯一ID。
masterable
| id | table1_id | table2_id |
| 1-null | 1 | null |
| null-2 | null | 2 |
| 1-null | 1 | null |
<<<错误的ID重复
答案 2 :(得分:0)
我认为您可以使用MySQL 5.7的virtual / generated列来实现所需的功能。这需要在表中存储一个额外的列,但是将防止重复的情况:
create table t1 (
id int primary key not null,
name varchar(30)
);
create table t2 (
id int primary key not null,
name varchar(30)
);
create table master (
id int primary key not null,
table1_id int,
table2_id int,
composite_value varchar(30) as
(concat(coalesce(table1_id, -1), ':', coalesce(table2_id, -1))),
constraint fk01 foreign key (table1_id) references t1 (id),
constraint fk02 foreign key (table2_id) references t2 (id),
constraint uq1 unique (composite_value)
);
insert into t1 (id, name) values (1, 'Chicago');
insert into t1 (id, name) values (2, 'Detroit');
insert into t2 (id, name) values (50, 'Anne');
insert into t2 (id, name) values (51, 'James');
insert into master (id, table1_id, table2_id) values (10, 1, 50);
insert into master (id, table1_id, table2_id) values (11, 1, 51);
insert into master (id, table1_id, table2_id) values (12, 1, 50); -- fails
insert into master (id, table1_id, table2_id) values (20, 1, null); -- succeeds
insert into master (id, table1_id, table2_id) values (21, 1, null); -- fails
这是您需要的吗?