php
  • mysql
  • 2010-07-19 78 views 1 likes 
    1

    我正在寻找一种方法,使某种功能进入PHP和MySQL谁给我作为一个简单的表中的记录的ID。非常快速的PHP-MySQL交互

    我得到了一个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命令或谁使事情变得更简单一些。

    我知道有一个插入IGNORE,但有没有办法让选择只有当不存在,并返回ID?

    我想要做的事,如:

    选择ID从表 其中value = '假' 如果不存在,则 INSERT INTO表(值)值( '假')

    所以我将获得的ID在一个步骤和MySQL将解决这一问题和代码的效率会更高或快速..

    (想象一下,我有使这10000次)

    回答

    3

    使用INSERT。 ..对重复密钥更新

    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或更高版本

    +0

    此功能也存在于http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html中,它需要'value'列上的唯一键。 – ceteras 2010-07-19 06:43:30

    +0

    好吧,对我来说感谢这是真的,我需要定义字符串上的唯一索引,但它的工作原理 – diego2k 2011-06-19 23:13:47

    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

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

    0

    您可能想要WHERE不存在。看看下面的示例,以得到一个想法:

    INSERT INTO表(值)SELECT ID WHERE NOT EXISTS(SELECT * FROM表WHERE值= '的事情来检查')LIMIT 1

    +0

    但是这将返回ID,如果它已经存在? – casablanca 2010-07-19 02:03:33

    相关问题