2016-04-13 20 views
-2

我有一個表:MySQL的 - 在重複鍵

Saves 
----- 
UserId (int primary key) 
Save (blob) 
SaveBackup (blob) 

這是填充了這一點:

Saves(22, 'xyz', '') 

我提交以下材料:

$stmt = $db->prepare("INSERT INTO Saves (UserId, Save, SaveBackup) " 
         . "VALUES (:UserId1, :Save1, '') ON DUPLICATE KEY " 
         . "UPDATE Saves SET SaveBackup=Save, Save=:Save2 " 
         . "WHERE UserId=:UserId2"); 
$stmt->execute(array(':Save1' => 'zzz', 
       ':Save2' => 'zzz', 
       ':UserId1' => 22, 
       ':UserId2' => 22)); 

它不工作,您的SQL代碼中出現錯誤。它工作正常,沒有所有東西在ON DUPLICATE KEY之前(包括)。

+0

您是否閱讀過文檔? http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html –

回答

2

您不能在INSERT中使用WHERE。這是沒有意義的,因爲INSERT的目的是添加一個新行,而不是修改現有的行。當您使用ON DUPLICATE KEY時,它會根據它想要插入的密鑰的重複數據來確定要更新的行,因此您不需要明確地告訴它。

您也不需要爲新值使用兩個佔位符。在ON DUPLICATE KEY子句中,如果要添加新行,則可以使用VALUES(Save)來表示插入到Save列中的值。

$stmt = $db->prepare("INSERT INTO Saves (UserId, Save, SaveBackup) " 
         . "VALUES (:UserId, :Save, '') ON DUPLICATE KEY " 
         . "UPDATE SaveBackup=Save, Save = VALUES(Save) "); 
$stmt->execute(array(':Save' => 'zzz', 
        ':UserId' => 22)); 
+0

感謝您的回覆。我將其標記爲答案,但後來嘗試過,但仍然無法正常工作。它說它失敗了:'致命錯誤:帶有消息'SQLSTATE [42000]的未捕獲異常'PDOException':語法錯誤或訪問衝突:1064您的SQL語法錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在第1行'SET SaveBackup = Save,Save = VALUES(Save)'附近使用正確的語法。 – Rewind

+0

'UPDATE'後有一個額外的'Saves',並且我複製了它成爲答案。 – Barmar

+0

也不應該有'SET'那裏。它只是'在重複密鑰更新col1 = val1,col2 = val2,...' – Barmar