跨多个字段的MySQL唯一性

时间:2010-07-22 21:50:30

标签: mysql database-design

我正在开发一款需要将人们聚集在一起的应用。每个人只能与另一个人匹配..因此,在下表中我试图使其与user1& user2在两个字段中都是唯一的:

CREATE TABLE `match_table` (
    `user1` int(11) NOT NULL,
    `user2` int(11) NOT NULL,
UNIQUE KEY `user2` (`user2`),
UNIQUE KEY `user1` (`user1`))

因此,例如,以下INSERT语句应忽略第2行和第4行。或者至少我需要能够标记要忽略的行。请注意,第5行是正常的,因为第2行和第4行已被忽略。

INSERT IGNORE INTO match_table (user1, user2)
VALUES
    (1,2),
    (2,3),
    (4,5),
    (6,4),
    (3,6)

是否有任何索引可以实现此目的? ..否则在插入后我可以做一些更新,可以标记我想忽略的那些?

2 个答案:

答案 0 :(得分:3)

假设匹配没有方向,您可以使用现有的表设计,但将匹配存储在表中:

INSERT IGNORE INTO match_table (user1, user2)
VALUES
(1,2),
(2,1),
(2,3),
(3,2),
(4,5),
(5,4),
(6,4),
(4,6),
(3,6),
(6,3)

如果您只是获取所有行,您将获得每次匹配两次。你可以按照以下方式避免这种情况:

SELECT * FROM match_table WHERE user1 < user2
1, 2
3, 6
4, 5

此设计的一个潜在问题是可以与匹配自己的用户插入一行。

答案 1 :(得分:0)

如果您只是要求数据库约束,可以使用UNIQUE INDEX('user1','user2')