2010-06-20 64 views
1

我需要插入記錄,但如果記錄存在,請替換。以下是我目前正在使用:mySQL如何更新和替換

$sessionDate = date("Y-m-d H:i:s"); 
    foreach($tmpVP as $sessionVP) { 
    $res = mysql_query("INSERT INTO sessions 
         (sessionID,sessionDate,sessionVS,sessionVP) 
         VALUES('$sessionID','$sessionDate','$sessionVS', 
         '$sessionVP')") ; 
    } 

我真正需要的是更新匹配sessionIDsessionVS,並sessionVP任何記錄,並插入不匹配的新記錄。

編輯:

表定義

CREATE TABLE `sessions` (
`ID` bigint(20) NOT NULL auto_increment, 
`sessionID` varchar(36) NOT NULL, 
`sessionDate` datetime NOT NULL, 
`sessionUser` bigint(20) NOT NULL, 
`sessionVS` varchar(255) NOT NULL, 
`sessionVP` bigint(20) NOT NULL, 
`reserved` int(11) NOT NULL, 
PRIMARY KEY (`ID`), 
KEY `ID` (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=88 DEFAULT CHARSET=utf8 

會話ID,sessionVP和sessionVS不是唯一的。示例:

sessionID     sessionDate   sessionUser sessionVS sessionVP 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268736 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268819 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268880 

所以,如果我有0t1m58q9ktejuhqlrjqglcoia0111111和`144268880' 一個新的紀錄:我需要更新列#3,而不是添加一行4#的。

+0

正如馬克·比爾斯建議的那樣,檢查是否有消毒輸入。 'mysql_real_escape_string' – DrColossos 2010-06-20 13:55:09

+0

請發表您的表格定義。 'SHOW CREATE TABLE sessions' – 2010-06-20 14:06:33

回答

5

首先,您應該在(sessionID, sessionVP, sessionVS)上添加一個唯一索引。您可以使用以下命令執行此操作:

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp 
ON sessions (sessionID, sessionVS, sessionVP) 

然後在MySQL中插入或更新有兩種相對簡單的方法。第一種方法是使用ON DUPLICATE UPDATE

INSERT INTO sessions 
(sessionID,sessionDate,sessionVS,sessionVP) 
VALUES 
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP') 
ON DUPLICATE KEY UPDATE sessionDate = '$sessionDate' 

還有另一種是使用REPLACE

REPLACE INTO sessions 
(sessionID,sessionDate,sessionVS,sessionVP) 
VALUES 
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP') 

第二個是稍微更簡潔,但缺點是它在內部產生一個刪除後插入。

還有其他的幾個問題:

  • 你不需要既是主鍵索引和ID一個普通的指數。因爲它是多餘的,刪除普通索引。

  • 您可能有一個SQL漏洞。如果您尚未驗證輸入,則可能需要考慮通過適當地使用mysql_real_escape_stringintval來保護自己。或者,您可以查看使用查詢參數。

  • 您沒有檢查錯誤情況。考慮使用trigger_error,這樣如果你的查詢有錯誤,你可以看到錯誤是什麼。查看錯誤消息可以爲您節省大量的時間調試。

    mysql_query("...") or trigger_error(mysql_error()); 
    
+0

您可能希望包含REPLACE的規定(刪除記錄並在「更新」時插入一個新記錄) – 2010-06-20 13:55:22

+0

@ d03boy:謝謝,補充說明。 – 2010-06-20 13:57:40

+0

感謝您的提示。我有他們在我的代碼,我只是沒有包括他們在我的樣本。 – user191688 2010-06-20 15:03:59

0

根據您的表結構,我的意思是主鍵,你可以使用

$res = mysql_query("REPLACE INTO sessions 
         (sessionID,sessionDate,sessionVS,sessionVP) 
         VALUES('$sessionID','$sessionDate','$sessionVS', 
         '$sessionVP')") ; 
1

添加唯一鍵上(sessionID, sessionVS, sessionVP),然後用REPLACE而不是INSERT(剛剛替補單詞,語法是一樣的)。