只能在列上应用一个唯一约束,而其他约束是否已定义?

时间:2016-04-20 10:01:33

标签: mysql sql database database-design

让我们说我们必须让人们投票,可以是来自用户或来宾:

CREATE TABLE votes (
  to_user_id INT UNSIGNED NOT NULL,
  from_user_id INT UNSIGNED,
  from_ip_address INT UNSIGNED
)

对于用户投票,我们要应用唯一约束(to_user_id, from_user_id),并为来宾约束(to_user_id, from_ip_address)

没有同时应用的唯一索引的组合,这些索引不会破坏任何这些:投票的唯一性和具有相同IP地址的不同用户投票的能力。

有什么好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

您可以更改数据结构:

CREATE TABLE Votes (
    VoteId int unsigned primary key,
    UserId int unsigned not null,
    IpAddress int unisgned,
    Which enum('from', 'to'),
    constraint unq_Votes_UserId_IpAddress_Which unique (UserId, IpAddress, Which)
);

请注意,我添加了一个主键,这对于外键引用非常方便,可以识别单个行,并维护插入的顺序。

答案 1 :(得分:0)

最终我找到了一个可以接受的解决方案:

CREATE TABLE votes (
  vote_id INT UNSIGNED AUTO_INCREMENT,
  to_user_id INT UNSIGNED NOT NULL,
  from_user_id INT UNSIGNED,
  from_user_ip INT UNSIGNED,
  from_guest_ip INT UNSIGNED,
  PRIMARY KEY (vote_id),
  UNIQUE INDEX (to_user_id, from_user_id),
  UNIQUE INDEX (to_user_id, from_guest_ip)
);

INSERT INTO votes (to_user_id, from_user_id, from_user_ip) VALUES (1, 2, 255), (1, 3, 255);
INSERT INTO votes (to_user_id, from_guest_ip) VALUES (1, 255);