我正在寻找一种方法来在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次)
答案 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