SQLite UPSERT有2个约束

时间:2013-02-27 14:58:42

标签: sql sqlite

我有一个包含3列的sql表,其中没有一列是UNIQUE(但是对名称+角色是):

 Name | Role | Votes

我需要做的是,写一个坚持以下规则的sqllite查询:

  1. 如果已存在具有给定名称和角色的行,则投票为 增加1
  2. 如果没有,则使用Votes = 1
  3. 创建一个新行

    我已经调查了INSERT OR REPLACE和this很棒的帖子,但它似乎对我帮助不大,我甚至不确定INSERT OR REPLACE是否可行,因为像< / p>

    INSERT OR REPLACE INTO words (name,role,votes) 
    VALUES ('foo','bar', coalesce((
        select votes from words where name = 'foo' and role='bar'),0)+1)
    

    始终坚持并永不替换

2 个答案:

答案 0 :(得分:1)

您只需在2列上创建唯一索引即可:

CREATE UNIQUE INDEX words_name_role_idx ON words (name,role)

请注意,您不为任何单个列创建唯一索引,而是为整个2组合创建唯一索引。

之后,您的REPLACE INTO语句应该开始正常运行:

REPLACE INTO words (name,role,votes) VALUES ('foo','bar',
    coalesce((
        SELECT votes FROM words
        WHERE name = 'foo' AND role='bar'),0
    )+1
)

(请注意,我已将counter更改为上面的votes

答案 1 :(得分:0)

此查询将使用+1更新您的记录。

update todo set text='raj',complete='raj',pk=((SELECT pk FROM todo where text='raj' and complete='raj')+1) where (SELECT pk FROM todo where text='raj' and complete='raj') 

编辑您的查询

update words set name='foo',role='bar', votes =((SELECT votes FROM words where name='foo' and role='bar')+1) where (SELECT votes FROM words where name='foo' and role='bar') 

如果此条件不成立,则进行插入查询。