Sqlite 3 插入和替换在 1 个以上的唯一列上失败


Sqlite 3 Insert and Replace fails on more than 1 unique column

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

表具有以下结构。

身份证 | poll_id |  选项 | ip_addressID : 自动递增poll_id:(字符串唯一)对于特定投票是唯一的 选项 : (字符串) 用户选择的选项   ip_address:(字符串唯一)用户的 IP 地址

这是我的查询

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"您的投票"的选项 4。 查询失败(它执行替换),但它应该插入一条带有"yourpoll"poll_id新记录

我认为,它只考虑了ip_addressunqiue约束,而不是poll_id

从您对所需功能的描述来看,您似乎希望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 
);

不,这是正确的行为。您对ip_addressUNIQUE约束,因此您可能没有两个具有相同ip_address的记录。改为将UNIQUE约束放在对(poll_id, ip_address)上。