update on duplicate key update
Ich habe eine Tabelle, die enthält eine shop-id und eine Spieler-id, und ein Spieler die Punkte.
Was ich tun möchte, ist die übertragung von Punkten von einem Geschäft zum anderen, die Sache ist die, dass die shop-id und Player id form einen eindeutigen index. Was ich tun möchte, ist on duplicate key update, anstatt lassen Sie es nicht aus, um die Punkte von einem Eintrag zum anderen, und löschen Sie die "von" - Eintrag.
So etwas wie:
UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... get the idea?
- Meine Vermutung ist, dass dies einfacher wäre mit 2(ish) Abfragen und eine if/else-block. Gibt es einen bestimmten Grund, warum Sie wollen, es zu tun auf diese Weise?
- Immer das beste aus einer Sprache potentions ist gute Praxis. Es geht eher darum, Dinge zu entdecken, und Dinge machen, die schneller Weise möglich.
- Ich hoffe wirklich, das hat korrekte SQL-escaping, wenn es in die Produktion bereitgestellt. Naked Variablen wie das ist besorgniserregend.
- Ah, bekomme ich das ganz. Ich denke, du hast kein Glück mit diesem, aber Sie könnten versuchen, eine gespeicherte Prozedur anstelle 😉
- Alle Variablen sind frei Herr tadman und verwendet den richtigen Weg. Wenn Sie etwas mehr zu empfehlen, dann tun Sie bitte.
- Hier ist die Antwort auf Ihr problem link
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nur änderungen im Zusammenhang mit einem Konflikt Zeile in der
ON DUPLICATE KEY
Bereich. Weiter, dies ist, soweit ich weiß, eine Eigenschaft, von derINSERT
- Anweisung.Was Sie brauchen, ist eine einfache Finanzbuchhaltung, wo Sie erfassen die Ergänzungen und Subtraktionen aus einer Bilanz, dann Tabellieren Sie diese entweder manuell oder mithilfe von Triggern.
Zum Beispiel, ist der einfachste Ansatz ist:
Dies ist möglicherweise leichter zu vertreten als ein paar Einträge:
Würden Sie hinzufügen eines Eintrags für die +n-Punkte und einen passenden eins für -n. Zu jeder Zeit können Sie ein Gleichgewicht mit
SUM(points)
. Sie konnte wrap up in einVIEW
um das retrieval zu erleichtern, oder wenn Sie wollen, denormalize die Summen in eine Spalte einer anderen Tabelle mit Hilfe eines trigger.Einem einfachen auslösen würde, geben Sie die folgende Anweisung für jeden betroffenen
boardId
:Dieser Schlüssel vermeidet Kollisionen in den ersten Platz, und bietet eine Revisionssichere Aufzeichnung der Transaktionen, die aufgetreten sind.
In jedem Fall, all dies zu tun automatisch würden Sie wahrscheinlich haben, um einen trigger verwenden.
mysql_real_escape_string
im Jahr 2012 ist erschreckend. Bitte, für Ihre eigene Vernunft nutzen, etwas vernünftiges, wie die PDO. Mit SQL-Platzhalter dies würde buchstäblich Kollaps zu zwei einfachen, lesbaren Zeilen. Wenn Sie?
oder, besser, benannte Parameter, dann bist du nur einbindParam
Anruf oder zwei Weg von Sicherheit. Es nimmt alle von dreißig Minuten um zu lernen, wie PDO effektiv.mysqli
ist, was Sie verwenden, wenn aus irgendeinem Grund Sie nicht verwenden können, PDO. Ich habe Zusammenhang mit der tutorial es. Es geht nicht nur um Sicherheit. Es geht darum, es zu tun rechts, so dass Sie nicht haben, die schlimmen Fehler später, wenn "Jimmy O 'Neil" - Schilder auf Ihre app. Immer noch, es sei denn, Sie Streben eine lange Karriere zu Schaufeln Haufen von chaotisch-SQL-Anweisungen, sollten Sie versuchen, ein ORM.mysql_real_escape_string
ist vorgesehen, dass zu beheben, abermysql_query
gefährlich ist standardmäßig aktiviert. Wenn Sie vermissen eine dieser, auch nicht versehentlich, es könnte zu schweren Problemen führen. Es sind SQL-injection-tools, die automatisch finden und nutzen selbst die kleinsten versehen. Mit PDO und wird diszipliniert über die Verwendung von SQL-Platzhaltern ist der einfachste Weg, um sicher zu sein, tun Sie es richtig.mysql_query
ist veraltet, die community wird versuchen, ihn zu töten-off. Finden Sie in der großen roten box auf die Dokumentation! Bitte, verwenden Sie es nicht.Nicht. Sie können nicht löschen Sie einen Datensatz, auf constraint-Verletzung in MySQL. Sie könnten möglicherweise machen ein before update-trigger, der überprüft, ob eine bevorstehende constraint-Verletzung, aber auch dann (ab 5.1) die Sie nicht ändern können, die gleichen die Daten der Tabelle (das würde wahrscheinlich dazu führen, dass eine Endlosschleife, in diesem Fall jedenfalls).
Nur halb fertig, bevor Tadman Antwort. Ich mag seine Idee, persönlich.