我试图在MySQL中实现一些我以前从未听说过的东西(可能是这样,研究对我没什么帮助)。
我尝试做的是在两列中强制MySQL中的唯一性。我的意思是不设置UNIQUE(column1,column2),而是设置以下两个条件:
因此,对于数据集{column1,column2},如果{1,2},{3,4},{5,6}是已存在的数据,那么这两列中的任何一列都不能具有上述任何一项新数据的数据项,即新数据项{x,y},其中x = NOT {column1} AND y = NOT {column2} AND x!= y
这可能吗?请帮帮我。谢谢。
答案 0 :(得分:0)
这可能有点矫枉过正,但您可以将column1
和column2
存储在单独的表格中。
假设你的桌子是
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
表的外键,该表仅包含值1
和2
。您也可以使用ENUM('1', '2')
,但ENUM始终允许空字符串作为值。