Mysql投票系统的唯一索引

时间:2012-02-21 12:01:26

标签: mysql sql unique unique-constraint

在用于记录职位投票的表中

CREATE TABLE votes
(
vote_id int(11) NOT NULL AUTO_INCREMENT,
post_id int(11) REFERENCES posts(post_id) ON DELETE CASCADE,
user_id int(11) REFERENCES users(user_id) ON DELETE SET NULL,
vote ENUM('Up', 'Down'),
ip varchar(255),
UNIQUE INDEX (on which???)
PRIMARY KEY(vote_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci

如何添加UNIQUE INDEX以避免重复投票?如果选民是用户,UNIQUE INDEX应该适用于(post_id,user_id);如果不是用户,UNIQUE INDEX应该适用于(post_id,ip)。

实际上,我只需要{post(id_id,user_id)OR(post_id,ip)UNIQUE INDEX;但不是两个。

3 个答案:

答案 0 :(得分:3)

修改后的更多信息要按照您的要求专门做,我会建议以下内容。添加源表以进一步标准化

CREATE TABLE vote_sources (
    source_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    // 0 will be treated as anonymous, as NULL can have issues on UNIQUE indexes
    user_id INT(11) UNSIGNED NOT NULL REFERENCES users(user_id) ON DELETE SET 0,
    ip VARCHAR(15) NOT NULL,
    dupeCheck VARCHAR(15) NOT NULL,
    PRIMARY KEY(source_id),
    UNIQUE INDEX (dupeCheck)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci

CREATE TABLE votes
(
    vote_id int(11) NOT NULL AUTO_INCREMENT,
    post_id int(11) REFERENCES posts(post_id) ON DELETE CASCADE,
    source_id int(11) NOT NULL REFERENCES vote_sources(source_id) ON DELETE CASCADE,
    vote ENUM('Up', 'Down'),
    PRIMARY KEY(vote_id),
    UNIQUE INDEX(post_id,source_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci

然后处理欺骗检查这个触发器

CREATE TRIGGER dupeSourceCheck
BEFORE INSERT ON vote_sources
FOR EACH ROW SET NEW.dupeCheck = IF(NEW.user_id>0,CAST(NEW.user_id AS CHAR),NEW.ip)

如果详细说明了重复的源,则会导致重复键错误,同时仍然会公开数字user_id以获得更有效的连接。

答案 1 :(得分:2)

我建议规范化:创建另一个字段,如vote_src VARCHAR(15),从代码中获取用户或IP,并为此创建唯一索引。

答案 2 :(得分:-1)

你有PHPMyAdmin吗?这很容易做到。你想要一个字段作为PRIMARY KEY还是你真的只想要一个独特的索引?如果您有PHPMyAdmin作为选项,您可以转到结构选项卡,在底部您将看到一个索引表,可以选择添加索引。点击'GO'和walla!你有索引。

相关问题