非常快速的PHP-MySQL交互

时间:2010-07-19 01:38:00

标签: php mysql

我正在寻找一种方法来在php和mysql中创建一些函数,他们在一个简单的表中给我一个记录的id。

我有一个id - >值表,其中id是自动增量字段。

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

$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但有没有办法只在不存在的情况下进行选择并返回ID?

我想做类似的事情:

从表格中选择ID           其中value ='dummy' 如果不存在那么 插入表(值)值('哑')

所以我将一步获取ID,MySQL将解决问题,代码将更有效或更快..

(想象一下我做了10000次)

3 个答案:

答案 0 :(得分:4)

使用INSERT ... ON DUPLICATE KEY UPDATE

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

需要mysql 5.1.12或更高版本

答案 1 :(得分:0)

如果您假设大多数Check()调用很可能最终会导致INSERT,那么您可以执行INSERT IGNORE并使用mysql_affected_rows检查是否有插入。如果没有插入,那么您可以运行SELECT id FROM并使用mysql_insert_id()。但是,如果该行更有可能存在,那么最好先运行SELECT语句。

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

如果节约资源是您的主要目标。您可能必须运行两个查询,即使它们合并为一个语句。

答案 2 :(得分:0)

你可能想要什么不存在。看看以下示例以获得一个想法:

INSERT INTO table(value)SELECT id WHERE NOT EXISTS(SELECT * FROM table WHERE value ='要检查的东西')LIMIT 1