如何在ON DUPLICATE KEY UPDATE的INSERT查询中使用WHERE子句?

时间:2014-01-24 17:45:36

标签: mysql sql

我一直在阅读关于这个主题的其他问题,但似乎无法得到我想要做的工作。

这是我的疑问:

INSERT INTO entries
(
    num_entries,
    m_d_y,
    last_entry
)
VALUES
(
    1,
    '01_24_2014',
    UNIX_TIMESTAMP()
)
ON DUPLICATE KEY UPDATE num_entries = (num_entries + 1), last_entry = UNIX_TIMESTAMP()

该查询有效,但我想添加一个条件,UPDATE仅在{1}}超过一秒前执行。

我尝试添加last_entry子句,但由于WHERE语句没有INSERT子句,因此无效。

有没有办法在我的查询中添加某种WHERE条件?

我试图这样做的原因是,在我的PHP代码中,我正在检查查询是否影响了任何行。我的目标是:

  1. 如果新行不存在,请插入新行
  2. 如果该行存在且如果最后一个条目是一秒钟之前更新该行
  3. 通过检查是否有任何行受到影响来检测是否在PHP中插入或更新了行(这就是我尝试进行此类查询的原因)

2 个答案:

答案 0 :(得分:1)

像这个人为的例子一样进行INSERT SELECT:

INSERT INTO entries (col names)
Select 1, '01_24_2014', UNIX_TIMESTAMP() WHERE critera
ON DUPLICATE KeY UPDATE ...

MySQL参考文献是here

答案 1 :(得分:1)

您是否只能使用您正在使用的脚本语言更改查询? last_entry来自该语言(或现在来自UNIX_TIMESTAMP()),因此您可以添加或省略ON DUPLICATE KEY UPDATE部分:

query = "INSERT INTO ...."
if less than a second ago:
  query += "ON DUPLICATE KEY UPDATE ...."

右?

或者您的意思是现有的last_entry必须是> 1秒钟?那可能更容易?:

ON DUPLICATE KEY UPDATE
  num_entries = IF(last_entry-1 < UNIX_TIMESTAMP(), num_entries + 1, num_entries),
  last_entry = IF(last_entry-1 < UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), last_entry)

或类似的东西? =)

(这是完全未经测试的。)