如果重复条目获得id

时间:2012-02-27 10:54:23

标签: php mysql sql

mysql中的问题 我的表名是categories

CREATE TABLE IF NOT EXISTS `categories` (
  `cid` int(10) NOT NULL AUTO_INCREMENT,
  `category_name` char(100) DEFAULT NULL,
  `parent` int(10) DEFAULT NULL,

  PRIMARY KEY (`cid`),
  UNIQUE KEY `parent` (`parent`,`category_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

parentcategory_name是唯一字段。

如果记录不存在,我想运行insert into command。;

select last_insert_id() #get last insert id.
UPDATE

我的PHP代码是:

$sql = "insert into categories (parent,category_name) values ('".$field[parent]."','".$temp->cat_name."')";
        if (@$db->query($sql)){
            $cid = $db->get_var("select last_insert_id()");
        }else{
            $cid = $db->get_var("SELECT cid FROM categories WHERE parent=".$field[parent]." and category_name='".$temp->cat_name."'");
    }

如何才能获得存在的id返回?

3 个答案:

答案 0 :(得分:1)

  

如果记录不存在,我想运行insert into command。;

您可以使用INSERT IGNORE ....

INSERT IGNORE INTO `categories` ( `category_name`, `parent` ) values ('A', 1); // will insert it
INSERT IGNORE INTO `categories` ( `category_name`, `parent` ) values ('A', 1); // will ignore it
INSERT IGNORE INTO `categories` ( `category_name`, `parent` ) values ('A', 2); // will insert it
INSERT IGNORE INTO `categories` ( `category_name`, `parent` ) values ('B', 2); // will insert it
INSERT IGNORE INTO `categories` ( `category_name`, `parent` ) values ('B', 2); // will ignore it

来自the docs

  

如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。

答案 1 :(得分:0)

select last_insert_id() 

成功插入后返回ID。为了进一步处理,您可以在成功插入后将其存储在数据库中。

您也可以使用insert ignore into ....来避免重复插入

答案 2 :(得分:0)

我认为这是最好的方法:

$sql = "insert into categories (parent, category_name) values ('".$field[parent]."','".$temp->cat_name."') ON DUPLICATE KEY UPDATE cid=LAST_INSERT_ID(cid)";

$db->query($sql);
$cid = $db->insert_id;
var_dump($cid);