我有一个数据库表,列为name
、date
和color
。名称是主键。
我想运行一个upsert命令:
- 如果它是该
name
的第一次条目,则应该插入它 - 如果
name
已经存在,则仅当传入条目的日期比当前该名称的条目的日期新时,我才希望更新该name
的条目
使用如下的Python SQL查询
f"INSERT INTO test (name, date, color)
VALUES ({variable_name}, {variable_date}, {variable_color})
ON CONFLICT (name) WHERE name = '{variable_name}' and '{variable_date}' > date
DO UPDATE SET (name, date, color) = (EXCLUDED.name, EXCLUDED.date, EXCLUDED.color)"
字符串
出乎意料的是,无论variable_date
是否比当前的variable_date
新,它都会更新该行。
我在下面的SQLFiddle中重新创建了它。第二个条目2014-01-01正在替换2015-01-01条目,尽管日期并不更新,如WHERE
子句所示。
http://sqlfiddle.com/#!17/6a594/8
为什么这不起作用,解决这个问题的更好方法是什么?
1条答案
按热度按时间kokeuurv1#
您的
WHERE
子句正在影响冲突测试,而不是更新。您的查询字符串应该如下所示:字符串
考虑重命名列
date
和name
。DATE
是保留关键字,NAME
是非保留关键字。两者都不应用作列名。