MySQL强制实现两列

时间:2017-04-22 15:20:03

标签: mysql unique

我试图在MySQL中实现一些我以前从未听说过的东西(可能是这样,研究对我没什么帮助)。

我尝试做的是在两列中强制MySQL中的唯一性。我的意思是不设置UNIQUE(column1,column2),而是设置以下两个条件:

  1. 如果column1中存在值,则不能在column1中重复该值(与设置UNIQUE(column1)相同)。
  2. 如果任一列中存在值,则其他列中不存在该值。
  3. 因此,对于数据集{column1,column2},如果{1,2},{3,4},{5,6}是已存在的数据,那么这两列中的任何一列都不能具有上述任何一项新数据的数据项,即新数据项{x,y},其中x = NOT {column1} AND y = NOT {column2} AND x!= y

    这可能吗?请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:0)

这可能有点矫枉过正,但您可以将column1column2存储在单独的表格中。

假设你的桌子是

create table items (
    id int primary key,
    column1 int,
    column2 int
);

有数据:

id | column1 | column2
---|---------|--------
 1 |       1 |       2
 1 |       3 |       4
 1 |       5 |       6

您可以将架构更改为

create table items (
    id int primary key
);

create table item_columns (
    item_id int,
    position int,
    val int,
    primary key (item_id, position),
    unique key (val),
    foreign key (item_id) references items(id)
);

有数据:

item_id | position | val
--------|----------|----
      1 |        1 |   1
      1 |        2 |   2
      2 |        1 |   3
      2 |        2 |   4
      3 |        1 |   5
      3 |        2 |   6

您可以使用

模拟旧架构
select i.id, c1.val as column1, c2.val as column2
from items i
left join item_columns c1
    on  c1.item_id = i.id
    and c1.position = 1
left join item_columns c2
    on  c2.item_id = i.id
    and c2.position = 2

如果您愿意,可以在视图中使用它。

演示:http://rextester.com/PPBT42478

为了保证position列的完整性,您可以将其设为positions表的外键,该表仅包含值12。您也可以使用ENUM('1', '2'),但ENUM始终允许空字符串作为值。