Ich habe jetzt eine Weile gesucht, aber ich kann keine einfache Lösung für mein Problem finden. Ich möchte einen Datensatz in einer Tabelle duplizieren, aber natürlich muss der eindeutige Primärschlüssel aktualisiert werden.
Ich habe diese Frage:
INSERT INTO invoices
SELECT * FROM invoices AS iv WHERE iv.ID=XXXXX
ON DUPLICATE KEY UPDATE ID = (SELECT MAX(ID)+1 FROM invoices)
Das Problem ist, dass dies nur ID
die Zeile ändert, anstatt die Zeile zu kopieren. Weiß jemand, wie man das behebt?
// edit: Ich möchte dies tun, ohne alle Feldnamen einzugeben, da sich die Feldnamen im Laufe der Zeit ändern können.
CREATE TEMPORARY TABLE tmp SELECT bla FROM invoices WHERE bla; UPDATE tmp SET id=NULL; INSERT INTO invoices SELECT * FROM tmp;
Column 'id' connot be null
Alex 'Antwort erfordert einige Sorgfalt (z. B. Sperren oder eine Transaktion) in Umgebungen mit mehreren Clients.
Angenommen, das
AUTO ID
Feld ist das erste in der Tabelle (ein normaler Fall), können wir implizite Transaktionen verwenden.Aus den MySQL-Dokumenten:
quelle
NULL
oder0
beide sind akzeptabel. Können Sie Screenshots des Problems veröffentlichen, indem Sie es reproduzieren und hier weitergeben?invoices
enthält einID
Feld AUTO_INCREMENT . Die Quelltabelletmp
nicht. Um die erforderliche 1: 1-Korrelation während des Einfügens zu erhalten, geben Sie0
als erstes Feld der Auswahl a an, das das Feld AUTO_INCREMENT der Zieltabelle ist. Dastmp.*
wählt alle Felder aus der Quelltabelle austmp
. Perfekt! Sie haben jetzt Ihre 1: 1-Korrelation. Super Antwort @Tim.NULL
und bin0
nicht dasselbe. Der aktuelle Kontext istAUTO_INCREMENT
aktiviert. Sie können in solche Felder keinen0
oder einenNULL
Wert einfügen . Wenn Sie sie jedoch als Eingaben in ein solches Feld verwenden, wird diesem Feld automatisch der nächste Sequenzwert zugewiesen . Und daher mein Kommentar. Beweis auf SQL Fiddle: sqlfiddle.com/#!9/d619f/1Sie wissen sicher, dass der DUPLICATE KEY ausgelöst wird, daher können Sie vorher MAX (ID) +1 auswählen:
quelle
Ihr Ansatz ist gut, aber das Problem ist, dass Sie "*" verwenden, anstatt Feldnamen einzugeben. Wenn Sie alle Spaltennamen außer dem Primärschlüssel eingeben, funktioniert Ihr Skript wie ein Zauber auf einem oder mehreren Datensätzen.
INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name ) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv WHERE iv.ID=XXXXX
quelle
Eine späte Antwort, die ich kenne, aber immer noch eine häufig gestellte Frage. Ich möchte eine weitere Antwort hinzufügen, die bei mir funktioniert hat, indem nur eine einzeilige
insert into
Anweisung verwendet wurde, und ich denke, dass dies unkompliziert ist, ohne eine neue Tabelle zu erstellen (da dies möglich ist ein Problem mitCREATE TEMPORARY TABLE
Berechtigungen sein):Die Lösung funktioniert für die
AUTO_INCREMENT
ID-Spalte. Andernfalls können SieID
der Anweisung auch eine Spalte hinzufügen :Es ist wirklich einfach und unkompliziert. Sie können alles andere in einer einzelnen Zeile ohne eine zweite Aktualisierungsanweisung für später aktualisieren (z. B. Aktualisieren einer Titelspalte mit zusätzlichem Text oder Ersetzen einer Zeichenfolge durch eine andere). Außerdem können Sie genau angeben, mit was genau Sie möchten duplizieren, wenn alles, dann ist es, wenn einige, können Sie dies tun.
quelle
INSERT into wp_options SELECT NULL, 'theme_mods_twopress', option_value, autoload FROM wp_options where option_name = 'theme_mods_onepress';
kopiert, während ich den Eintrag (AUTO_INCREMENT
NULL
Trick von oben) und dasoption_name
Feld vergrößert habe .Ich wollte nur Alex 'großartige Antwort erweitern, um sie angemessen zu machen, wenn Sie zufällig einen ganzen Satz von Datensätzen duplizieren möchten:
Ich musste das nur tun und fand Alex 'Antwort ein perfekter Ausgangspunkt!. Natürlich müssen Sie @x auf die höchste Zeilennummer in der Tabelle setzen (ich bin sicher, Sie könnten das mit einer Abfrage abrufen). Dies ist nur in dieser sehr speziellen Situation nützlich. Seien Sie also vorsichtig, wenn Sie nicht alle Zeilen duplizieren möchten. Passen Sie die Mathematik nach Bedarf an.
quelle
Ich habe ein ähnliches Problem, und das mache ich:
Preguntas gewesen:
Das
ID
wird also automatisch inkrementiert und ich verwende auch einen festen Wert ('23') fürEncuestaID
.quelle
Ich brauchte das auch; Meine Lösung bestand darin, SQLYOG (kostenlose Version) zu verwenden, um den gewünschten Datensatz als SQL zu exportieren (erstellt eine Einfügung).
Ich habe dies dann von Hand bearbeitet, um die ID zu entfernen, da diese automatisch generiert werden muss, und dann die Einfügung in SQLYog kopiert, um sie auszuführen. Das war schmerzlos. Ich denke, viele andere MySQL-GUIs können dies ebenfalls.
Dadurch erhält ich eine Aufzeichnung, die ich für Testzwecke auf einem Live-System verwenden kann.
Ich habe diese Beilage jetzt auch zur Wiederverwendung, da die Tabelle täglich neu geschrieben wird.
quelle
Leichte Abweichung, Hauptunterschied besteht darin, das Primärschlüsselfeld ("varname") auf null zu setzen, was eine Warnung erzeugt, aber funktioniert. Wenn Sie den Primärschlüssel auf null setzen, funktioniert die automatische Inkrementierung beim Einfügen des Datensatzes in die letzte Anweisung.
Dieser Code bereinigt auch frühere Versuche und kann ohne Probleme mehrmals ausgeführt werden:
quelle