Insert ... on duplicate key update nichts mit MySQL
Mein problem ist, dass ich mehrere eindeutige Schlüssel einer Tabelle.
- Einfügen ignorieren ist keine option, da es unterdrückt die Fehler.
- MySQL hat keine Unterstützung für jede Art von Bedingungen außerhalb einer Anweisung (ex. if (cond), dann einfügen sonst nicht einfügen)
- Gespeicherte Prozeduren sind keine option (der einzige Ort, ich kann die if/else-Anweisungen)
- On duplicate key update könnte ein Schlüssel mit einem neuen Wert, aber ich will die eindeutigen Schlüssel nicht zu ändern, im Fall eines fehl, ist der unique-Einschränkung.
Also die einzige Möglichkeit wäre, Sie auf duplizieren, nur nicht aktualisieren, nichts. Gibt es eine Möglichkeit, kann ich dies erreichen? Oder gibt es andere Optionen?
- Warum sind gespeicherte Prozeduren nicht eine option?
- und warum on duplicate key update könnte ein Schlüssel mit dem neuen Wert?
- Was wollen Sie passieren, wenn es einen doppelten Schlüssel? Sie müssen wissen, dass es einen Konflikt?
- Wenn es einen doppelten Schlüssel dont nichts zu tun ... Aber ich muss wissen, ob es irgendeinen anderen Konflikt außer duplizieren (ex. fk-constraint).
- Das ist das problem , ich kann einfach nicht lassen Sie das update stmt leer. Ich brauche einige Attribut, das zu ändern.
- Siehe meine Antwort - Sie können eine Spalte Wert, um den vorhandenen Wert -, foreign key-Constraints wird, sprudeln im Gegensatz zu
IGNORE
aber keine Werte ändern, die auf Konflikt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen
ON DUPLICATE KEY UPDATE
nicht wirklich etwas tun, stellen Sie einfach eine Spalte Wert an den vorhandenen Wert an. Andere Konflikte wie z.B. foreign key-Einschränkungen sprudeln, im Gegensatz zur Verwendung derIGNORE
Schlagwort, aber keine Werte ändern, die auf Konflikt.Wenn Sie wollen, um sicherzustellen, dass keine gültigen Daten änderungen im Falle eines Konflikts, können Sie fügen Sie eine Spalte mit beliebigen Daten in der Tabelle, und verwenden Sie diese für die
UPDATE
- Anweisung.Eine Dritte option, wenn Sie möchten, um alle Logik in Ihrer Anwendung und nicht in die Datenbank ein
SELECT
Anweisung, zuerst zu prüfen, potentielle Konflikte bevor Sie IhrenINSERT/UDPATE
- Anweisung.Zwar ausgeschlossen, die für Ihr Szenario, eine gespeicherte Prozedur, die würden auch in der Lage sein, um diese Logik in einem einzigen Datenbank-Aufruf.
UPDATE
oder wenn Sie wirklich wollen, um sicherzustellen, dass keine wichtigen Felder ändern, fügen Sie eine weitere Spalte mit Etagenbett Daten und verwenden Sie, die in IhremUPDATE
- Anweisung.SELECT
zuerst zu prüfen, doppelte Daten, und Folgen Sie dann mit derINSERT
. Nicht so effizient, aber es hält die Logik in Ihrer app.Fand eine weitere option, falls jemand stolpert über dieses Problem.
Wenn Ihre Tabelle hat eine autoincremented primary key , aktualisieren können Sie die pk so :