【问题标题】:ON DUPLICATE KEY UPDATE - with conditionON DUPLICATE KEY UPDATE - 有条件
【发布时间】:2015-08-11 16:03:03
【问题描述】:

尚未对 INSERT INTO ... ON 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

这可能吗?

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • UNIQUE INDEX 后面的user and visitor id 是什么意思?最后加上USING BTREE是什么意思?
    • user and visitor id 只是索引的名称。使用 BTREE 用于列比较(` =、>、>=、dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
    【解决方案2】:

    U 应该在 (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)
          "; 
    

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2013-10-03
      相关资源
      最近更新 更多