如果不存在则插入并在PHP& MySql中获取插入ID

时间:2016-02-18 18:13:19

标签: php mysql mysqli

我正在开发一个PHP脚本,我只是想知道我是否可以使这个代码片具有更好的性能。

我必须制作2个mysql查询才能完成我的任务。有没有其他方法可以通过更好的性能来完成这个?

$language = "en";
$checkLanguage      =   $db->query("select id from language where shortName='$language'")->num_rows;
if($checkLanguage>0){
    $languageSql    =   $db->query("select id from language where shortName='$language'")->fetch_assoc();
    $languageId     =   $languageSql['id'];
}else{
    $languageSql    =   $db->query("insert into language(shortName) values('$language')");
    $languageId     =   $db->insert_id;
}
echo $languageId

2 个答案:

答案 0 :(得分:3)

您可以通过将stamtement对象存储到变量来提高性能,这样可以减少一个查询:

$checkLanguage      =   $db->query("select id from language where shortName='$language'");
if($checkLanguage->num_rows >0){
    $languageSql    =   $checkLanguage->fetch_assoc();
    $languageId     =   $languageSql['id'];
}else{
    $languageSql    =   $db->query("insert into language(shortName) values('$language')");
    $languageId     =   $db->insert_id;
}
echo $languageId

或第二个选项,您可以向languageshortName添加唯一约束。

如果你插入一个副本,它会抛出一个错误,如果没有它会插入,这样你只保留一个查询INSERT一个,但你可能需要一个try catch for duplicates。

答案 1 :(得分:0)

为什么不做这样的事情:

$language = "en";
$dbh = $db->query("INSERT IGNORE INTO `language` (`shortName`) VALUES ('{$language}');");
$id = $db->insert_id;
echo (($id !== 0) ? $id : FALSE);

这将在单个查询中执行您的逻辑,并返回id或重复的false。通常最好在SQL而不是PHP中解决数据库性能问题,因为大约65%的开销是在与数据库的实际连接中,而不是查询本身。与改进围绕它们的脚本逻辑相比,减少运行的查询数量通常会对性能产生更好的影响。一直依赖ORM的人经常会遇到很多麻烦,因为cookie cut SQL通常效率不高。