Ich habe folgende Frage:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
Ich möchte die ID des Inserts oder des Updates. Normalerweise führe ich eine zweite Abfrage aus, um dies zu erhalten, da insert_id () meiner Meinung nach nur die 'eingefügte' ID und nicht die aktualisierte ID zurückgibt.
Gibt es eine Möglichkeit, die ID der Zeile einzufügen / zu aktualisieren und abzurufen, ohne zwei Abfragen auszuführen?
alter table tablename AUTO_INCREMENT = 0;
die obige Abfrage ausführen , um große Lücken in Ihren ID-Werten zu vermeiden.Antworten:
Überprüfen Sie diese Seite: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Am Ende der Seite Sie erklären, wie Sie LAST_INSERT_ID für Aktualisierungen sinnvoll machen können, indem Sie einen Ausdruck an diese MySQL-Funktion übergeben.
Aus dem MySQL-Dokumentationsbeispiel:
quelle
Um genau zu sein, wenn dies die ursprüngliche Abfrage ist:
und 'id' ist der Primärschlüssel für die automatische Inkrementierung, als dies die funktionierende Lösung wäre:
Ist alles hier: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
quelle
Sie können sich REPLACE ansehen, bei dem es sich im Wesentlichen um ein Löschen / Einfügen handelt, wenn der Datensatz vorhanden ist. Dies würde jedoch das Feld für die automatische Inkrementierung ändern, falls vorhanden, wodurch die Beziehungen zu anderen Daten unterbrochen werden könnten.
quelle
Ich weiß nicht, was Ihre Version von MySQL ist, aber mit InnoDB gab es einen Fehler mit Autoinc
Fehler in 5.1.20 und behoben in 5.1.23 http://bugs.mysql.com/bug.php?id=27405
Fehler in 5.1.31 und behoben in 5.1.33 http://bugs.mysql.com/bug.php?id=42714
quelle
Ich bin auf ein Problem gestoßen, wenn ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID (id) den Primärschlüssel um 1 erhöht. Die ID der nächsten Eingabe innerhalb der Sitzung wird also um 2 erhöht
quelle
Es ist erwähnenswert, und dies mag offensichtlich sein (aber ich werde es hier aus Gründen der Klarheit trotzdem sagen), dass REPLACE die vorhandene übereinstimmende Zeile wegbläst, bevor Sie Ihre neuen Daten einfügen. ON DUPLICATE KEY UPDATE aktualisiert nur die von Ihnen angegebenen Spalten und behält die Zeile bei.
Aus dem Handbuch :
quelle
Die vorhandenen Lösungen funktionieren, wenn Sie Autoincrement verwenden. Ich habe eine Situation, in der der Benutzer ein Präfix definieren kann und die Sequenz bei 3000 neu starten sollte. Aufgrund dieses unterschiedlichen Präfixes kann ich keine automatische Inkrementierung verwenden, wodurch last_insert_id für Einfügungen leer wird. Ich habe es mit folgendem gelöst:
Wenn das Präfix vorhanden ist, wird es erhöht und last_insert_id ausgefüllt. Wenn das Präfix nicht vorhanden ist, wird das Präfix mit dem Wert 3000 eingefügt und last_insert_id mit 3000 gefüllt.
quelle