在sqlite中插入或更新?

在sqlite中插入或更新?,sql,sqlite,Sql,Sqlite,我的桌子是: CREATE TABLE IF NOT EXISTS BrowseHistory ( id INTEGER NOT NULL, tid INTEGER NOT NULL PRIMARY KEY, data BLOB NOT NULL) 我想做的是给出tid和数据,我想找到如果没有记录的tid==给定的tid,然后插入它(id是max(id)+1)。如果有,请检查id是否等于max(id),如果没有,请将id设置为max(id)+1。 我使用了下面的sql,它可以工作,但它总是

我的桌子是:

CREATE TABLE IF NOT EXISTS BrowseHistory (
id INTEGER NOT NULL, 
tid INTEGER NOT NULL PRIMARY KEY, 
data BLOB NOT NULL)
我想做的是给出tid和数据,我想找到如果没有记录的tid==给定的tid,然后插入它(id是max(id)+1)。如果有,请检查id是否等于max(id),如果没有,请将id设置为max(id)+1。 我使用了下面的sql,它可以工作,但它总是将id设置为max(id)+1


这在SQLite本身中是不可能的

从实际编程语言执行此操作:

cursor.execute(“更新…”)
如果cursor.rowcount==0:
cursor.execute(“插入…”)

replace功能基于主键之间的冲突解决方案工作。因为您的
tid
不是表的主键,所以这个想法行不通。@GergelyBacso实际上,
tid
是该表的主键。给定的SQL将始终尝试计算出哪个id是最大的,然后添加1,并使用它。如果我理解正确,您希望在发生冲突时检查正在更新的行,然后决定是否更新id。使用
插入或替换
,这是不可能的
insert或replace
将首先确定要尝试插入的值,如果由于主键冲突导致插入失败,将更新相应的行,但您不能在
values
子句中编写条件表达式,以了解这是插入还是更新。@LasseV.Karlsen,我完全错过了那里的CREATETABLE语句。在表中有一个不是主键的id字段有点奇怪。Ok。我不知道是否有一行sqlite语句可以解决这个问题。我不会因为你不喜欢就删除我答案的第一句话。:-)
INSERT OR REPLACE INTO BrowseHistory (id, tid, data) values ((SELECT IFNULL(MAX(id),0) FROM BrowseHistory) + 1, ?, ?)