MYSQL On Duplicate Key Update仅在记录中有特定值时才更新

时间:2018-02-20 17:45:44

标签: mysql sql

我有一个包含4列的MySQL表:

    personId(int)
    dateX(date)
    ratio(decimal 11,2)
    closed(boolean, e.g. tintyint(1)).

personId和dateX是主键。 3个第一列是真正使用的列,第四列只是用作指示符,不应再修改此记录,因为此值已用于某些计算,因此它应保持静态。我正在使用此查询:

INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=:ratio;

它运作得很好。但是,它不会考虑任何“封闭”记录。我试着这样做:

INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=IF(closed=1,ratio,:ratio); 

但它不起作用。如果有任何关闭= 1的记录,则不会更新任何记录。 我也尝试过在网上找到的其他类型的查询:

INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=:ratio WHERE closed!=1;

但是这给了我一个MySQL错误。

请你指出我正确的方向,我做错了什么?我需要执行插入记录的查询,但如果已经有一个具有相同主键的记录,那么它应检查“已关闭”参数!= 1并更新此记录。我不想事先运行SELECT查询,我相信应该有一种方法只用一个MySQL查询来执行它。提前谢谢。

1 个答案:

答案 0 :(得分:0)

根据您的逻辑,我认为主键应该是(personId, dateX, closed)shortestPath()。我不能从你的描述中说出来。你想要吗:

  1. 每个人最多两条记录,一条是开放的,一条是关闭的?
  2. 每天最多两个记录,一个是开放的,一个是关闭的?
  3. 多个已关闭的记录只能打开一个?
  4. 根据问题中的逻辑,我猜(2)。如果(3),那么这可能不是正确的方法。