0

テーブルを使用して、さまざまな投票でさまざまなユーザーの投票を保存しています。

テーブルは以下の構造になっています。

ID | poll_id | 選ぶ | IPアドレス

id : 自動インクリメント

poll_id : (STRING UNIQUE) 特定の投票で一意  

opt : (STRING) ユーザーが選択したオプション    

ip_address: (STRING UNIQUE) ユーザーの 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「yourpoll」のオプション 4 に投票した場合。 クエリは失敗します (置換を行います)が、poll_id 'yourpoll' を持つ新しいレコードを挿入する必要があります

私が思うに、それはのみのunqiue制約を考慮しますが、ip_addresspoll_id

4

2 に答える 2

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 
);
于 2012-06-10T21:00:34.013 に答える
1

いいえ、これは正しい動作です。にUNIQUE制約がip_addressあるため、同じ を持つ 2 つのレコードが存在しない可能性がありますip_address。代わりに、UNIQUE制約をペアに設定してください。(poll_id, ip_address)

于 2012-06-10T21:02:09.673 に答える