MySQL INSERT wenn nicht vorhanden

  • Halloo :D. Ich weiß dieses Thema kann man lansgam nicht mehr sehen, aber alles was ich gefunden habe, habe ich nicht verstanden oder war nicht geeignet für meinen nutzen.


    Wenn ein Spieler auf den Server Joint soll geschaut werden ob seine UUID bereits existiert sollte dies der fall sein, dann soll nichts passieren.
    Wenn ein Spieler einen Kill macht dann soll bei dem Datensatz mit der UUID des Spielers die Kill Spalter um +1 erhöt werden und all das ohne das doppelte datensätze,werte etc. entstehen. Wie mache ich das am einfachsten?


    Bin ein extremer SQL noob :D.


    Lg Antons
    7a8cd6b637.png

  • 1. UUID mit einem Unique Index versehen und dann INSERT INTO players VALUES ([uuid], [name], 0, 0, 0, 0). Beim Ausführen wird dann ein Fehler geworfen. Diesen kannst du dann mit einem try-catch Block abfangen
    2. UPDATE players SET kills = kills + 1 WHERE uuid = [uuid]

    MfG


    00110101 00110001 00110101 00111000 00110100 00110110 00110011 00110001 00110101 00111001 00110101 00110111 00110100 00110110 00110011 00110000 00110110 00110001 00110101 00110111 00110100 01000100 00110011 01000100 8o

  • Er bewirkt, dass nicht zweimal der gleiche Wert in dieser Spalte stehen kann

    MfG


    00110101 00110001 00110101 00111000 00110100 00110110 00110011 00110001 00110101 00111001 00110101 00110111 00110100 00110110 00110011 00110000 00110110 00110001 00110101 00110111 00110100 01000100 00110011 01000100 8o

  • Der gewährleistet, dass keine weitere Zeile mit dem gleichen Index eingefügt werden kann. Wirft dann jedoch standardmäßig einen Fehler, bei einer solchen Operation. Um ihn zu ersetzen mit den neuen Werten, würde ich mit REPLACE arbeiten: http://dev.mysql.com/doc/refman/5.7/en/replace.html - Der Unique Index ist dennoch aus Sicht der "Daten-Integrität" nicht schlecht :)


    EDIT: Oh, da war ich wohl etwas zu langsam.

  • Beim Ausführen wird dann ein Fehler geworfen. Diesen kannst du dann mit einem try-catch Block abfangen

    Exceptions sind Fehler und auch als solche zu verwenden. Sie für den normalen Programmablauf zu nutzen ist afaik entgegen der Konvention und - da ein Stacktrace erzeugt werden muss - auch nicht gerade so günstig.


    Als weiteren Ansatz kenne ich noch INSERT .... ON DUPLICATE KEY UPDATE, wie ebenfalls in der Doku beschrieben unter https://dev.mysql.com/doc/refman/5.7/en/insert.html. Das nutze ich bei solchen Situationen immer.


    Ich weiß nicht ob REPLACE, lt. Doku löscht das eine gefundene Zeile, und das ist hier ja nicht gewollt. (Müsste aber selbst testen, wie sich das genau verhält.)

  • INSERT .... ON DUPLICATE KEY UPDATE

    Das erwartet aber noch einen Ausdruck dahinter. Da aber der Threadersteller nichts von setzen gesagt hat, ist es nicht möglich dieses zu verwenden.

    MfG


    00110101 00110001 00110101 00111000 00110100 00110110 00110011 00110001 00110101 00111001 00110101 00110111 00110100 00110110 00110011 00110000 00110110 00110001 00110101 00110111 00110100 01000100 00110011 01000100 8o

  • Das stimmt natürlich! Allerdings geht es mir grad nur um die Funktion. Also UUID Geht Kills nicht :/


  • Vergessen ^^

  • Das erwartet aber noch einen Ausdruck dahinter. Da aber der Threadersteller nichts von setzen gesagt hat, ist es nicht möglich dieses zu verwenden.

    Vergessen zu erwähnen, dass ich davon ausging, das INSERT der UUID onJoin wegzulassen und erst - wenn benötigt - beim Update der Kills diesen Query zu nutzen. (Dachte wohl, dass meine Gedanken verstanden werden... ^^)


    Wenn man (on Join die UUID mit 0-Werten anlegen möchte und damit) nur einen Insert möchte, wenn ein Key nicht exisitiert, reicht meiner Meinung nach ein INSERT IGNORE um den Fehler zu ignorieren.

  • Ich weiß nicht ob REPLACE, lt. Doku löscht das eine gefundene Zeile, und das ist hier ja nicht gewollt. (Müsste aber selbst testen, wie sich das genau verhält.)

    Ist Implementationsabhängig. Prinzipiell ist dein Ansatz sicherlich aber der sauberere. Der entfiel mir gerade im Eifer des Gefechts, habe ihn aber bei mir vielfach in Verwendung und kann bestätigen, dass ON DUPLICATE KEY UPDATE hier klappen sollte.


    MySQL.executeCommand("UPDATE Tabellenname SET Kills = Kills + 1 WHERE UUID = " + "'" + killer.getUniqueId() + "'");

    Soweit ich weiß, solltest du hier entweder SET Kills = (Kills + 1) schreiben, oder aber SET Kills = Kills+1.


    EDIT: Heute schwinge ich irgendwie nicht mit der Zeit. Dein Fehler bezieht sich auf ein ganz anderes Problem, nämlich das dein "Killer" der Pfeil ist, und nicht der Spieler.

  • Stimmt! Ich teste es nämlich grad mit mir selbst. Ich schieße mich selbst ab xD


    Aber ich habe das selbe ja auch nochmal für Deaths gemacht sprich:


    Java
    MySQLAPI.executeCommand("UPDATE Elytrengames SET Deaths = (Deaths + 1) WHERE UUID = " + "'" + killed.getUniqueId() + "'");

    Wäre es in dem Fall nicht egal was mich tötet?

  • Du musst von der MySQL Class:



    So. Mehr kann ich dir nicht helfen. wenn du etwas nicht verstehst schau dir doch mal dieses Video an:


    Video Nr. 1
    Video Nr. 2