我正在建立一个包含两个字段user_id和count的数据库,并且如果表中已经存在具有相同user_id的记录,我希望能够插入这对值或将count递增1。
我已经尝试了许多解决方案,例如INSERT INTO ... ON DUPLICATE KEY UPDATE ...,但是它们对我不起作用。它抛出一个错误,指出:
sqlite3.OperationalError: near "ON": syntax error
我正在python 3.7上运行SQLite 3.21.0。
这是我的代码:
def add_warning(id):
sql = f"""INSERT INTO warnings (user_id, count) VALUES({id}, 1) ON CONFLICT(user_id) DO UPDATE SET count=count+1"""
cursor.execute(sql)
我希望在执行查询时更新计数值,但是当我尝试这样做时会引发错误。
答案 0 :(得分:3)
假设user_id
是表的primary key
,则可以使用(INSERT OR) REPLACE
:
sql = "REPLACE INTO warnings (user_id, count) VALUES(?, COALESCE((SELECT count + 1 FROM warnings WHERE user_id = ?), 1))"
cursor.execute(sql1, (id, id,))
请参见demo。
答案 1 :(得分:2)
您尝试使用的upsert语法仅在SQLite版本3.24.0
或更高版本上受支持。这说明了为什么您的代码无法正常工作,这是一种解决方法:
sql1 = "INSERT OR IGNORE INTO warnings (user_id, count) VALUES (?, 0)"
cursor.execute(sql1, (id,))
sql2 = "UPDATE warnings SET count = count + 1 WHERE user_id = ?"
cursor.execute(sql2, (id,))
这里的逻辑是,如果尚未找到该用户,则初始插入一个带有零计数的用户记录。然后,无论如何,我们总是将计数更新一个。
答案 2 :(得分:0)
您也可以尝试一下。 这适用于SQL Server,但我尚未在SQLite上尝试过
sql = "IF EXISTS (select user_id FROM warnings WHERE user_id={0}) " + \
"BEGIN " + \
"UPDATE warnings SET count = count + 1 WHERE user_id={0} " + \
"END " + \
"ELSE " + \
"INSERT INTO warnings (user_id, count) VALUES ({0}, 0 )".format(id)