【问题标题】:MySQL enforce uniqueness across two columnsMySQL 强制跨两列的唯一性
【发布时间】:2017-04-22 15:20:02
【问题描述】:

我正在尝试在 MySQL 中实现以前从未听说过的事情(也许是这样,研究对我没有多大帮助)。

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

  1. 如果 column1 中存在某个值,则不能在 column1 中重复(与设置 UNIQUE(column1) 相同)。
  2. 如果某个值存在于任一列中,则该值不能存在于另一列中。

因此,对于数据集 {column1,column2},如果 {1,2}, {3,4}, {5,6} 是已经存在的数据,那么这两列都不能有上述任何一个新数据的数据项,即新数据项 {x,y} 其中 x=NOT{column1} AND y=NOT{column2} AND x!=y

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

【问题讨论】:

  • 这里需要一个触发器
  • 您需要设置插入和更新触发器来执行此操作。
  • 嗯,我明白了。我希望有一个内置的解决方案。我猜 column1 和 column2 是具有相同选择的 ENUM 这一事实也无济于事。感谢您的回复。
  • 实现这一目标的最佳方法是什么?触发器还是存储过程?在实现简单性和执行速度方面?

标签: mysql unique


【解决方案1】:

这可能有点矫枉过正,但您可以将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 始终允许空字符串作为值。

【讨论】:

    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多