mysql - 重复 key 更新 - 有条件

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

还没有大量使用 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_date 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)

关于mysql - 重复 key 更新 - 有条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946674/

相关文章:

MySQL计算两个数字之间的行数

mysql - MySQL 左连接与关系 1 :X 的总和

php - 如何优化此查询以快速加载 friend

postgresql - 如何合并 UNIQUE 索引中可能有 NULL 值的两个表?

postgresql - PostgreSQL 如何强制执行 UNIQUE 约束/它使用什么类型的索引?

mysql - 获取范围内的最大日期

PostgreSQL - 重复的唯一键

mysql - 将电子邮件 VARCHAR(320) 存储为 UNIQUE,#1071 - 指定的键太长;最大 key 长度为 767

mysql - 如果其中一个字段已经是唯一的,我可以添加一个复合唯一键吗

php - 将 utf-8 数据库转换为 utf8mb4 时出现重复输入错误