检查是否存在,如果是,则更新1 ++,如果不插入

时间:2010-04-10 19:39:06

标签: php mysql

嘿伙计们快速提问,我目前有一个插入声明 $query= "INSERT into new_mail VALUES ('$to1', '0')"; 其中字段为username,message_number为 目前我要做的是检查条目是否存在,是做一个select查询,然后用mysql_num_rows(php)检查行数。如果rows == 1,那么我得到当前的 message_number 并将其设置为等于

$row['message_number']+1. 

然后我用另一个查询更新该条目。

是否有一种更简单的方法可以在只有一个查询的mysql中完成所有这些(检查是否存在,如果不是插入,如果是这样更新message_number,增加1)?

4 个答案:

答案 0 :(得分:5)

根据表格的结构,您可以使用INSERT的{​​{3}}(链接到MySQL手册)功能:

INSERT into new_mail VALUES ('$to1', '0') ON DUPLICATE KEY UPDATE message_number=message_number+1

答案 1 :(得分:4)

使用INSERT...ON DUPLICATE KEY UPDATE。 MySQL手册有一个例子,几乎完全符合你的需要:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

要完成此工作,您需要在用于检查重复项的列上添加UNIQUE索引。但有一个重要警告:

  

通常,您应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY子句。

答案 2 :(得分:3)

对你的问题和你的桌面结构感到有些困惑,但我认为你想要这样的东西。

INSERT INTO new_mail (username, message_number)
VALUES ($username, $message_number) 
ON DUPLICATE KEY UPDATE message_number=message_number + 1;

这假设username是您的主键(更像是userid)。希望这会有所帮助。

答案 3 :(得分:1)

编辑:ON DUPLICATE KEY UPDATE答案更好,但你可以这样做(躲避选择查询):

假设你正在使用mysqli extenson:

$db = //Some construction of mysqli object;
$sql = 'UPDATE tablename SET RowValue = RowValue + 1 WHERE message_number = ?';
$updateStatement = $db->prepare($sql);
$updateStatement->bind_param('i', $message_number);
$message_number = //Set message number;
$updateStatement->execute();
if ($updateStatement->affectedRows == 0) {
    $sql = 'INSERT INTO tablename (RowValue,  message_number) VALUES (?, ?)';
    $insertStatement = $db->prepare($sql);
    $insertStatement->bind_param('ii', $rowValue, $messageNumber);
    $rowValue = something;
    $messageNumber = something;
    $insertStatement->execute();
}