在用于记录职位投票的表中
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
;但不是两个。
答案 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!你有索引。