ON DUPLICATE KEY UPDATE - 有条件

时间:2015-08-11 16:03:04

标签: mysql unique-key unique-index on-duplicate-key

INSERT INTO没有多少工作...在DUPLICATE KEY UPDATE查询中,所以请引导我找到解决方案。

数据库表名为'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

这可能吗?

2 个答案:

答案 0 :(得分:1)

U应该有一个UNIQUE复合键(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)
      "; 

答案 1 :(得分:1)

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

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)