In MySQL versuche ich, eine Zeile mit einer automatischen Inkrementierung zu kopieren column ID=1
und die Daten in dieselbe Tabelle einzufügen wie eine neue Zeile mit column ID=2
.
Wie kann ich das in einer einzigen Abfrage tun?
Verwendung INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
Wo c1, c2, ...
sind alle Spalten außer id
. Wenn Sie explizit mit einer id
von 2 einfügen möchten, fügen Sie diese in Ihre INSERT-Spaltenliste und Ihre SELECT:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
id
Im zweiten Fall müssen Sie sich natürlich um ein mögliches Duplikat von 2 kümmern .
IMO, das Beste scheint SQL-Anweisungen nur zum Kopieren dieser Zeile zu verwenden, während gleichzeitig nur auf die Spalten verwiesen wird, die Sie ändern müssen und möchten.
Siehe auch av8n.com - So klonen Sie einen SQL-Datensatz
Leistungen:
your_table
in eine atomare Operation eingefügt .quelle
Error Code: 1113. A table must have at least 1 column
.SET id=NULL
kann einen Fehler verursachenColumn 'id' cannot be null
. Sollte ersetzt werden durchUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Angenommen, der Tisch ist
user(id, user_name, user_email)
.Sie können diese Abfrage verwenden:
quelle
Result: near "SELECT": syntax error
Dies hat geholfen und unterstützt BLOB / TEXT-Spalten.
quelle
Für eine schnelle und saubere Lösung, bei der Sie keine Spalten benennen müssen, können Sie eine vorbereitete Anweisung verwenden, wie hier beschrieben: https://stackoverflow.com/a/23964285/292677
Wenn Sie eine komplexe Lösung benötigen, damit Sie dies häufig tun können, können Sie dieses Verfahren anwenden:
Sie können es ausführen mit:
Beispiele
HAFTUNGSAUSSCHLUSS: Diese Lösung ist nur für Personen gedacht, die häufig wiederholt Zeilen in vielen Tabellen duplizieren. Es könnte in den Händen eines betrügerischen Benutzers gefährlich sein.
quelle
Sie können auch '0' als Wert für die automatisch zu erhöhende Spalte übergeben. Der richtige Wert wird beim Erstellen des Datensatzes verwendet. Dies ist so viel einfacher als temporäre Tabellen.
Quelle: Kopieren von Zeilen in MySQL (siehe den zweiten Kommentar von TRiG zur ersten Lösung von Lore)
quelle
Viele tolle Antworten hier. Unten finden Sie ein Beispiel für die gespeicherte Prozedur, die ich geschrieben habe, um diese Aufgabe für eine von mir entwickelte Web-App auszuführen:
quelle
quelle
Wenn Sie MySQL Workbench verwenden können, können Sie dies tun, indem Sie mit der rechten Maustaste auf die Zeile klicken und "Zeile kopieren" auswählen, dann mit der rechten Maustaste auf die leere Zeile klicken und "Zeile einfügen" auswählen und dann die ID ändern Klicken Sie auf "Übernehmen".
Kopieren Sie die Zeile:
Fügen Sie die kopierte Zeile in die leere Zeile ein:
Ändern Sie die ID:
Anwenden:
quelle
Ich habe nach der gleichen Funktion gesucht, aber ich benutze MySQL nicht. Ich wollte ALLE Felder kopieren, außer natürlich den Primärschlüssel (ID). Dies war eine One-Shot-Abfrage, die in keinem Skript oder Code verwendet werden sollte.
Ich habe mich mit PL / SQL zurechtgefunden, bin mir aber sicher, dass jede andere SQL-IDE dies tun würde. Ich habe ein Basic gemacht
Exportieren Sie es dann in eine SQL-Datei, in der ich die finden konnte
Ich habe es gerade bearbeitet und verwendet:
quelle
Ich neige dazu, eine Variation dessen zu verwenden, was mu zu kurz gepostet hat:
Solange die Tabellen identische Felder haben (mit Ausnahme des automatischen Inkrements in der Protokolltabelle), funktioniert dies einwandfrei.
Da ich nach Möglichkeit gespeicherte Prozeduren verwende (um anderen Programmierern, die mit Datenbanken nicht allzu vertraut sind, das Leben zu erleichtern), wird das Problem gelöst, dass Prozeduren jedes Mal aktualisiert werden müssen, wenn Sie einer Tabelle ein neues Feld hinzufügen.
Außerdem wird sichergestellt, dass beim Hinzufügen neuer Felder zu einer Tabelle diese sofort in der Protokolltabelle angezeigt werden, ohne dass Ihre Datenbankabfragen aktualisiert werden müssen (es sei denn, Sie haben natürlich Felder, die ein Feld explizit festlegen).
Warnung: Sie sollten sicherstellen, dass Sie beiden Tabellen gleichzeitig neue Felder hinzufügen, damit die Feldreihenfolge gleich bleibt. Andernfalls treten merkwürdige Fehler auf. Wenn Sie der einzige sind, der Datenbankschnittstellen schreibt UND Sie sehr vorsichtig sind, funktioniert dies gut. Andernfalls bleiben Sie bei der Benennung aller Ihrer Felder.
Hinweis: Wenn Sie nicht an einem Solo-Projekt arbeiten, werden Sie sicher nicht andere daran arbeiten, alle Feldnamen explizit aufzulisten und Ihre Protokollanweisungen zu aktualisieren, wenn sich Ihr Schema ändert. Diese Verknüpfung ist wahrscheinlich nicht die langfristigen Kopfschmerzen wert, die sie verursachen kann ... insbesondere auf einem Produktionssystem.
quelle
quelle
Speichern Sie die Zeile, die Sie in SQL speichern möchten, und verwenden Sie dann das generierte SQL abzüglich der ID-Spalte, um es wieder zu importieren.
quelle