【问题标题】:MySQL - "insert if not exists" query?MySQL - “如果不存在则插入”查询?
【发布时间】:2013-11-08 21:29:18
【问题描述】:

我正在尝试编写一个 MySQL 查询,如果用户在过去 24 小时内没有访问过博文,它将更新博文查看计数器。我正在尝试写这样的东西(但这不起作用):

  IF EXISTS (
     SELECT 1
     FROM `posts-views`
     WHERE
        `ip` = '".$_SERVER['REMOTE_ADDR']."'
        AND
        `time` > ".($time-60*60*24)."
        AND
        `post` = $id
  ) THEN
  NULL

  ELSE

  INSERT INTO `posts-views`
  (`post`, `time`, `ip`, `user`)
  VALUES
  ($id, $time, '".$_SERVER['REMOTE_ADDR']."', $me)

修复查询的正确方法是什么?

【问题讨论】:

  • 你可以使用insert ignore - 如果存在重复键的行,它将插入或直接传递而不会出错,它还有很好的功能on duplicate key update
  • 我不知道在这种情况下如何使用 INSERT IGNORE。我没有插入相同的数据。时间可能不同。
  • 你可以,如果你添加只有日期部分的新列(用户每天可以投票 1 次)
  • Insert ignore 需要唯一的密钥,我认为在这种情况下无法创建,因为 time 的条件:time > ....
  • stackoverflow.com/questions/3164505/…此链接可能对您有所帮助。

标签: mysql


【解决方案1】:

据我所知,在这种情况下你不能使用INSERT IGNORE,但类似下面的东西应该可以完成这项工作:

  INSERT INTO `posts-views`
  (`post`, `time`, `ip`, `user`)
  SELECT $id, $time, '".$_SERVER['REMOTE_ADDR']."', $me 
  FROM dual 
  WHERE NOT EXISTS (
     SELECT 1
     FROM `posts-views`
     WHERE
    `ip` = '".$_SERVER['REMOTE_ADDR']."'
      AND
    `time` > ".$time-60*60*24."
    AND
    `post` = $id
  )

我完全省略了绝对应该在实际代码中完成的转义变量。

更新 - 添加from dual 以避免语法错误

【讨论】:

  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的 'WHERE NOT EXISTS ( SELECT 1 FROM posts-views WHERE ' 附近使用正确的语法
  • @Richard Rodriguez:检查更新版本,应该不错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2014-04-14
  • 2013-01-10
  • 1970-01-01
  • 2011-09-10
  • 2011-07-14
相关资源
最近更新 更多