2010-04-10 86 views
2

嗨快速的问题,我现在有一个INSERT语句 $query= "INSERT into new_mail VALUES ('$to1', '0')";其中字段的用户名和message_number 目前,我会做什么检查该条目存在,是做一个选择查询,然后检查mysql_num_rows(PHP)的行数。如果行== 1然后我得到当前message_number并设置它等于检查是否存在,如果是这样,更新1 ++,如果不插入

$row['message_number']+1. 

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

有没有一种简单的方法来做只有一个查询(如果存在,如果不插入,如果更新message_number,增加1)检查是否所有这一切?

+0

你使用mysqli扩展吗? – 2010-04-10 19:40:42

+0

它的默认值为php,但我还没有使用该格式,但是我打算在几周内将所有查询改为mysqli。 – Scarface 2010-04-10 19:44:28

回答

4

使用INSERT...ON DUPLICATE KEY UPDATE。 MySQL手册有哪些做几乎正是你需要的一个例子:

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

为了使这项工作,你需要在你用它来检查重复列添加一个唯一索引。但有一个重要的警告:

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

+1

感谢马克欣赏扩大的答案。 – Scarface 2010-04-10 20:05:53

5

根据你的表是如何组织的,您可以使用ON DUPLICATE KEY UPDATE(链接到MySQL手册)功能的INSERT

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

+1:啪!和我一样的答案。 :) – 2010-04-10 19:47:13

+0

感谢Issac赞赏+1 – Scarface 2010-04-10 20:06:08

1

编辑:对重复密钥更新的答案是更好的,但你可以这(逃避的选择查询):

假设你正在使用的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(); 
} 
+0

您可以将此技术与我的解决方案结合使用,但如果您希望多次执行此查询(例如,数百次),则使用mysql准备的语句只会很有帮助 – bigstylee 2010-04-10 19:49:46

+1

@bigstylee:好处不在于性能方面的原因,而在于安全性原因。无论执行查询的次数多少,您都应该使用准备好的语句。 – 2010-04-10 19:50:58

+0

一个有效的观点,但在我看来,没有使用这种技术,可以用更少的代码(因此更易读/可维护)来实现相同的安全级别。但我同意这两种情况都有很好的论据。 – bigstylee 2010-04-10 19:59:28

3

你的问题和你的表格结构有点困惑,但我想你想要这样的东西。

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

这是假设username是你的主键(更可能像用户ID)。希望这可以帮助。

+0

感谢bigstylee +1 – Scarface 2010-04-10 20:07:36

相关问题