1

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

 Name | Role | Votes

我需要做的是,编写一个遵守以下规则的 sqllite 查询:

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

我已经研究过 INSERT OR REPLACE 和这篇很棒的帖子,但它似乎对我没有太大帮助,我什至不确定 INSERT OR REPLACE 是一个可行的选择,因为类似

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

总是插入并且从不替换

4

2 回答 2

4

您只需在 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
)

(请注意,我已更改countervotes上面)。

于 2013-02-28T07:20:27.690 回答
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') 

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

于 2013-02-27T16:45:11.197 回答