Sqlite 3插入和替换在多于一个唯一列上失败

时间:2012-06-10 20:51:29

标签: php mysql sqlite

我正在使用一张表来存储不同用户在不同民意调查中的投票。

表具有以下结构。

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

2 个答案:

答案 0 :(得分:2)

根据您对所需功能的描述,您似乎希望poll_idip_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)上。