2016-05-11 10 views
1

Ich habe Dutzende von Beiträgen über ON DUPLICATE KEY UPDATE gelesen, aber bisher hat keiner von diesen meinen spezifischen Anwendungsfall abgedeckt. Hier ist meine einfache Code im Moment:Update, wenn eine bestimmte von mehreren existiert, sonst einfügen

$query = "INSERT INTO $DatabaseName .`scores` (`id`, `name`, `score` , `score2`) 
    VALUES (NULL, '$name', '$score', '$score2');"; 
    ON DUPLICATE KEY UPDATE 
    name='$name', score='$score', score2='$score2', 

Ich habe ein anderes Skript, das ein Benutzer „höchste Punktzahl“ überwacht und vergleicht sie mit ihrem „aktuellen Spielstand“. Wenn die "aktuelle Punktzahl" höher als die "höchste Punktzahl" wird, löst dies den obigen Code aus.

Standardmäßig werden die Benutzerdaten in die Datenbank eingefügt (da sie noch nicht existiert). Aber wenn bereits ein Eintrag mit diesem 'Namen' existiert, möchte ich nur 'score' und 'score2' aktualisieren (die 'id' und 'name' sollten unverändert bleiben). Beachten Sie, dass ich hier speziell nach einem "Namen" -Duplikat suchen muss, denn wenn 'score' oder 'score2' identisch mit einem bestehenden Eintrag sind, ist das egal.

Ist dies mit ON DUPLICATE KEY UPDATE möglich, oder muss ich bestimmte Felder abrufen und Bedingungen verwenden? Ich würde es vorziehen, wenn nicht möglich.

+1

Haben Sie eine eindeutige Einschränkung für "name"? –

+2

Wenn ich richtig verstehe, ist "Name" ein eindeutiger Index in Ihrem DB-Schema. Oder zumindest sollte es sein. Wenn dies der Fall ist, sollte es kein Problem geben, da das INSERT für einen vorhandenen 'Namen' den DUPLICATE KEY auslöst und Sie die Score-Werte aktualisieren können. – Holger

+0

Ich habe keine eindeutige Einschränkung für 'name'. Wenn ich meinen obigen Code unter Verwendung eines Wertes für 'name', der bereits existiert, einfüge, wird nichts eingefügt, oder zumindest die existierende Zeile bleibt unverändert. – FrontEnd

Antwort

2

Es sollte funktionieren, wenn Sie die UNIQUE-Index für die Spalte name hinzufügen:

ALTER TABLE `scores` ADD UNIQUE `name_unique` (`name`); 

Und keine Notwendigkeit, eine NULL-ID einfügen oder den Namen Spalte aktualisieren:

$query = "INSERT INTO $DatabaseName .`scores` (`name`,`score`,`score2`) 
      VALUES ('$name', '$score', '$score2') 
      ON DUPLICATE KEY UPDATE score='$score', score2='$score2'"; 

Und auch, Sie sollten eine vorbereitete Anweisung verwenden, anstatt PHP-Variablen direkt in die Anfrage einzufügen.

+0

Fantastisch, das hat funktioniert. Danke vielmals :) – FrontEnd

Verwandte Themen