我正在使用一张表来存储不同用户在不同民意调查中的投票。
表具有以下结构。
id | poll_id | opt | ip_address id : auto increment poll_id : (STRING UNIQUE) unique for a particular poll opt : (STRING) option selected by user ip_address: (STRING UNIQUE) ip address of user
这是我的查询
INSERT OR REPLACE INTO tbl_poll(id,poll_id,opt,ip_addr) VALUES (null,'$poll_id','$opt','$ip_addr')
(Here $poll_id, $opt and $ip_addr are php variables which holds the respective values)
现在,情况就是这样,
用户'A'投票支持poll_id'mypoll'的选项2。查询工作完美。 (插入)
用户'A'改变了对poll_id'mypoll'选项5的想法和投票。查询工作完美。 (替换)
但是如果用户'A'投票支持poll_id'yourpoll'的选项4。 查询失败(它会替换)但是它应该使用poll_id'yotpoll'插入新记录
我认为,它仅考虑unqiue
的{{1}}约束,而不考虑ip_address
答案 0 :(得分:2)
根据您对所需功能的描述,您似乎希望poll_id
和ip_address
成为唯一对或复合唯一
CREATE TABLE tbl_poll (
id INTEGER PRIMARY KEY AUTOINCREMENT,
poll_id STRING NOT NULL,
ip_address STRING NOT NULL,
opt STRING NULL,
CONSTRAINT 'unique_vote_per_poll_per_ip_address' UNIQUE ( poll_id, ip_address ) ON CONFLICT REPLACE
);
答案 1 :(得分:1)
不,这是正确的行为。
您在UNIQUE
上有ip_address
个约束,因此您可能没有两个具有相同ip_address
的记录。
将UNIQUE
约束放在货币对(poll_id, ip_address)
上。