postgresql 仅当传入条目的日期比当前日期新时更新

3wabscal  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(127)

我有一个数据库表,列为namedatecolor。名称是主键。
我想运行一个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
为什么这不起作用,解决这个问题的更好方法是什么?

kokeuurv

kokeuurv1#

您的WHERE子句正在影响冲突测试,而不是更新。您的查询字符串应该如下所示:

"
INSERT INTO test (name, date, color) 
VALUES ({variable_name}, {variable_date}, {variable_color})
  ON CONFLICT (name) DO
    UPDATE
      SET date = EXCLUDED.date,
          color = EXCLUDED.color
      WHERE date < EXCLUDED.date
"

字符串
考虑重命名列datenameDATE是保留关键字,NAME是非保留关键字。两者都不应用作列名。

相关问题