如何阻止唯一键上的NULL值?

时间:2019-07-16 16:26:03

标签: mysql

我有以下问题。我的表结构是这样的:

//table1
id
name

//table2
id
name

//mastertable
id
table1_id
table2_id

并且mastertable具有table1table2的外键,但只能在每一行中使用它们中的任何一个,而另一个将是{{1 }}。

问题是,行中不能有重复项,例如:

NULL

但是MySQL确实允许这样做,因为我在{ table1_id: 1, table2_id: NULL} { table1_id: 1, table2_id: NULL} 上使用了NULL值。而且我需要这两个列可以为空,否则我就不能在它们上有外键(例如,如果我使用0而不是table2_id)。

有什么办法解决这个问题?

编辑:如果不清楚,则该表已经具有NULLtable1_id的唯一键。

另一项编辑:我正在考虑将唯一键分为两部分,每张表一个。那行吗,还是以后会再次咬我?

3 个答案:

答案 0 :(得分:0)

您是否尝试过多列索引?

如果不行,则另一种解决方案(最可靠的方法)是让脚本检查行是否存在。使用它也没错。

答案 1 :(得分:0)

您可以在masterable中添加一个额外的列,该列将是使用table1_idtable2_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

这是您需要的吗?