2010-04-10 117 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

相關問題