2016-04-13 7 views
-2

Ich habe eine Tabelle:MySql - Ein Doppelte Key

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

Das mit dieser gefüllt ist:

Saves(22, 'xyz', '') 

Ich gebe folgendes:

$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)); 

Es funktioniert nicht, Fehler in Ihrem SQL-Code. Es funktioniert gut ohne alle Sachen, die dem ON DUPLICATE KEY vorangehen (und einschließen).

+0

Haben Sie die Dokumentation gelesen? http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html –

Antwort

2

Sie können WHERE in INSERT nicht verwenden. Es macht keinen Sinn, da der Zweck von INSERT ist, eine neue Zeile hinzuzufügen, keine bestehende Zeile zu ändern. Wenn Sie ON DUPLICATE KEY verwenden, ermittelt es, welche Zeile Sie aktualisieren möchten, da es eine Duplizierung des Schlüssels hat, den Sie einfügen möchten, sodass Sie es nicht explizit angeben müssen.

Sie müssen auch nicht zwei Platzhalter für den neuen Wert verwenden. In der ON DUPLICATE KEY-Klausel können Sie VALUES(Save) verwenden, um den Wert zu bezeichnen, der in die Spalte Save eingefügt würde, wenn eine neue Zeile hinzugefügt würde.

$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

Danke für die Antwort. Ich habe es als Antwort markiert, aber dann habe ich es versucht und es funktioniert immer noch nicht. Es besagt, dass es fehlschlägt: 'Fataler Fehler: Nicht abgefangene Ausnahme' PDOException 'mit Nachricht' SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, für die richtige Syntax in der Nähe von 'SET SaveBackup = Speichern, Speichern = VALUES (Speichern)' in Zeile 1 .. – Rewind

+0

Sie hatten ein zusätzliches 'Saves' nach 'UPDATE' und ich kopierte es in die Antwort. – Barmar

+0

Auch dort sollte "SET" nicht da sein. Es ist nur 'ON DUPLICATE KEY UPDATE col1 = val1, col2 = val2, ...' – Barmar