重复密钥更新 - 有条件

ON DUPLICATE KEY UPDATE - with condition

还没有对 INSERT INTO ... ON DUPLICATE KEY UPDATE 查询进行大量工作,所以请引导我找到解决方案。

数据库 table 名为 'tb_logs',有 4 列:

log_user_id, log_visitor_id, log_date, log_counter

我想插入数据,并且只更新 log_datelog_counter,如果行 log_user_id AND log_visitor_id 已经存在且值与我要插入的值完全相同。

无论我尝试过什么,都无法正常工作,它更新了不应更新的行,或添加了不应添加的新行。

我最近的代码:

$sql = "
        INSERT INTO tb_logs (
          log_user_id,
          log_visitor_id,
          log_date,
          log_counter
        ) VALUES (
          '{$user}',
          '{$visitor}', 
          UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
          '1'
        ) ON DUPLICATE KEY UPDATE
          log_user_id='{$user}',
          log_visitor_id='{$visitor}',
          log_date=UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
          log_counter=log_counter+1
      "; 

也许我只是没有正确理解 ON DUPLICATE KEY UPDATE 查询?

示例:

log_user_id   log_visitor_id   log_date   log_counter
--------------------------------------------------------
     1              5          23434234        1

当现在 log_user_id=1 AND log_visitor_id=5 时,不要插入新行,只更新 log_datelog_counter

这可能吗?

你应该在 (log_user_id, log_visitor_id)

上有一个唯一的复合键
ALTER TABLE  `tb_logs` ADD UNIQUE (
    `log_user_id` ,
    `log_visitor_id`
);

然后

$sql = "
        INSERT INTO tb_logs (
          log_user_id,
          log_visitor_id,
          log_date,
          log_counter
        ) VALUES (
          '{$user}',
          '{$visitor}', 
          UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
          '1'
        ) ON DUPLICATE KEY UPDATE
          log_date=VALUES(log_date),
          log_counter=log_counter+VALUES(log_counter)
      "; 

是的,首先创建一个唯一索引。

ALTER TABLE `tb_logs`
ADD UNIQUE INDEX `user and visitor id` (`log_user_id`, `log_visitor_id`) USING BTREE;

然后像您所做的那样构造您的查询;

INSERT INTO tb_logs (
    log_user_id,
    log_visitor_id,
    log_date,
    log_counter
)
VALUES
    ('{$user}',
      '{$visitor}', 
      UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
      '1')
 ON DUPLICATE KEY
UPDATE log_counter = log_counter + 1, log_date = UNIX_TIMESTAMP(CURRENT_TIMESTAMP)