如何在表中插入值或如何更新表中的值

时间:2019-10-20 08:32:49

标签: python sql sqlite

我正在建立一个包含两个字段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)

我希望在执行查询时更新计数值,但是当我尝试这样做时会引发错误。

3 个答案:

答案 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)