【问题标题】:SQLite UPSERT with 2 constraints [duplicate]具有 2 个约束的 SQLite UPSERT [重复]
【发布时间】:2013-02-13 10:44:14
【问题描述】:

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

 Name | Role | Votes

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

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

我已经查看了 INSERT OR REPLACE 和 this 很棒的帖子,但它似乎对我没有太大帮助,而且我什至不确定 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)

总是插入,从不替换

【问题讨论】:

  • 这不是重复的,因为我的列都不是唯一的或可以这样设置
  • 你只需要添加复合唯一列CONSTRAINT tb_UQ UNIQUE (Name, RoleID),我给你的链接就可以了。
  • 你是对的 :) 无论如何,我认为我发布的查询,一旦将约束添加到表中,比你链接的那个更好,不是吗?
  • 我想知道您为什么需要获得counter
  • 拿到柜台是什么意思?你想知道那张桌子是干什么用的,或者选择的原因?

标签: sql sqlite


【解决方案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)。

【讨论】:

    【解决方案2】:

    此查询将使用 +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') 
    

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

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2021-02-05
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多