代码之家  ›  专栏  ›  技术社区  ›  diego2k

非常快速的php-mysql交互

  •  1
  • diego2k  · 技术社区  · 14 年前

    我正在寻找一种方法,将某种函数转换成php和mysql,然后由它们在一个简单的表中为我提供一个记录的ID。

    我得到了一个id->值表,其中id是一个autoincrement字段。

    我知道的自然方法或简单方法是:

    $myId = Check('Cheese');
    
    function Check($value) {
    
    
    
          $sql = "SELECT id FROM table WHERE value = '$value'");
    
    
          $res = mysql_query($sql);
    
          if ($res) 
    
             return mysql_result($res,0);
    
    
          // If the record doesn't exist then continue to insert the record
    
          $sql = "INSERT INTO table (value) values ('$value')";
    
          $res = mysql_query($sql);
    
          return mysql_insert_id();
    
    }
    

    好吧,我想这是经典的方法……但是我认为必须有一个mysql命令或者一些使事情变得简单的东西。

    我知道有一个insert-ignore,但是有没有一种方法可以让select只在不存在的情况下返回id?

    我想做如下的事情:

    从表中选择ID 其中value='dummy' 如果不存在,那么 插入到表(值)值(“dummy”)中

    因此,我将在一个步骤中获得ID,MySQL将解决这个问题,代码将更加高效或快速。

    (想象我做了10000次)

    3 回复  |  直到 14 年前
        1
  •  4
  •   nathan    14 年前

    使用插入…重复密钥更新时

    function Check($value) {
      $sql = "INSERT INTO table (value) values ('$value') ON DUPLICATE KEY UPDATE value='$value'";
      $res = mysql_query($sql);
      return mysql_insert_id();
    }
    

    需要MySQL5.1.12或更高版本

        2
  •  0
  •   direct00    14 年前

    你可能想要不存在的地方。请看下面的示例以了解一个想法:

    插入到表(值)中选择不存在的ID(从表中选择*值为要检查的内容)限制1

        3
  •  0
  •   abelito    14 年前

    如果您假设有很大可能大多数check()调用最终会导致插入,那么您可以执行insert-ignore并使用mysql_-affected_行检查是否有插入。如果没有插入,则可以运行select id from并使用mysql_insert_id()。但是,如果该行更可能存在,那么最好先运行一条SELECT语句。

    http://php.net/manual/en/function.mysql-affected-rows.php

    如果节约资源是你的主要目标,那就是。您可能需要运行这两个查询,即使它们组合成一个语句。