insert into table select * from table where primarykey=1
Ich möchte nur eine Zeile kopieren, um sie in dieselbe Tabelle einzufügen (dh ich möchte eine vorhandene Zeile in der Tabelle duplizieren), aber ich möchte dies tun, ohne alle Spalten nach dem "Auswählen" auflisten zu müssen, da diese Tabelle hat zu viele Spalten.
Aber wenn ich das mache, bekomme ich den Fehler:
Doppelter Eintrag 'xxx' für Schlüssel 1
Ich kann damit umgehen, indem ich eine weitere Tabelle mit denselben Spalten wie ein temporärer Container für den Datensatz erstelle, den ich kopieren möchte:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
Gibt es einen einfacheren Weg, dies zu lösen?
mysql
copy
duplicates
row
Lina
quelle
quelle
max(oldtable.id) + oldtable_temp.key
um sicherzustellen, dass die IDs inkrementieren und eindeutig sind.Antworten:
Ich habe Leonard Challis 'Technik mit ein paar Änderungen verwendet:
Als temporäre Tabelle sollte es nie mehr als einen Datensatz geben, damit Sie sich nicht um den Primärschlüssel kümmern müssen. Wenn Sie den Wert auf null setzen, kann MySQL den Wert selbst auswählen, sodass kein Risiko besteht, ein Duplikat zu erstellen.
Wenn Sie sicher sein möchten, dass nur eine Zeile eingefügt werden kann, können Sie LIMIT 1 am Ende der Zeile INSERT INTO hinzufügen.
Beachten Sie, dass ich auch den Primärschlüsselwert (in diesem Fall 1) an meinen temporären Tabellennamen angehängt habe.
quelle
tmptable_1
vs.tmptable
) istprimarykey
INT NULL ausführen ; nach der ersten Zeile, damit die Lösung funktioniertUpdate 07/07/2014 - Die Antwort, die auf meiner Antwort von Grim ... basiert , ist eine bessere Lösung, da sie meine unten stehende Lösung verbessert. Daher würde ich vorschlagen, diese zu verwenden.
Sie können dies tun, ohne alle Spalten mit der folgenden Syntax aufzulisten:
Sie können den Primärschlüssel auch auf andere Weise ändern.
quelle
tmptable
, müssen Sie dieWHERE primarykey = 2
Anweisung auch nicht für die letzte Zeile hinzufügen . (Dh nurINSERT INTO table SELECT * FROM tmptable
.)Ich gehe davon aus, dass Sie möchten, dass der neue Rekord einen neuen hat
primarykey
? Wennprimarykey
istAUTO_INCREMENT
dann dies nur tun:... wo
col1, col2, col3, ...
sind alle Spalten in der Tabelle außerprimarykey
.Wenn es sich nicht um eine
AUTO_INCREMENT
Spalte handelt und Sie den neuen Wert auswählen möchten, istprimarykey
er ähnlich:... wo
567
ist der neue Wert fürprimarykey
.quelle
Bei Ihrer ersten Abfrage hatten Sie es fast geschafft, nur die Spalten anzugeben. Auf diese Weise können Sie Ihren Primärschlüssel in der Einfügung ausschließen, wodurch das automatische Inkrement ausgeführt wird, das Sie wahrscheinlich in der Tabelle haben, um automatisch einen neuen Primärschlüssel für das zu erstellen Eintrag.
Ändern Sie dies beispielsweise:
Dazu:
Fügen Sie die Primärschlüsselspalte weder in die Spaltenliste für die INSERT- noch für die SELECT-Teile der Abfrage ein.
quelle
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
oder ähnliches?Sie können auch versuchen, die Tabelle zu sichern, den Einfügebefehl zu finden und zu bearbeiten:
Das
--skip-extended-insert
gibt Ihnen einen Einfügebefehl pro Zeile. Sie können dann die Zeile in Ihrem bevorzugten Texteditor finden, den Befehl extrahieren und den Primärschlüssel auf "Standard" ändern.quelle
Bei diesem Verfahren wird Folgendes vorausgesetzt:
Natürlich ist dies nicht perfekt, aber in bestimmten (wahrscheinlich den meisten) Fällen wird es funktionieren.
quelle
works
aber der Ansatz ist solide und von Wert, da er hier einzigartig ist und tatsächlich die Frage des OP beantwortet.Wenn das Primärschlüsselfeld Ihrer Tabelle ein automatisches Inkrementfeld ist, können Sie die Abfrage mit Spalten verwenden. Zum Beispiel hat Ihre Tabelle mit dem Namen
test_tbl
3 Felder alsid, name, age
.id
ist ein Primärschlüsselfeld und ein automatisches Inkrementieren, sodass Sie die folgende Abfrage verwenden können, um die Zeile zu duplizieren:Diese Abfrage führt dazu, dass jede Zeile dupliziert wird.
Wenn das Primärschlüsselfeld Ihrer Tabelle kein automatisches Inkrementfeld ist, können Sie die folgende Methode verwenden:
Das Ergebnis dieser Abfrage ist eine doppelte Zeile von
id=19
eingefügt alsid=20
.quelle
tableName
(fieldName1
,fieldName2
,fieldName3
) SELECTfieldName1
,fieldName2
,fieldName3
VONtableName
DENEN 1 (alle von ihnen auf einmal kopieren)Dies kann mit etwas Kreativität erreicht werden:
Dies führt dazu, dass die neue Zeile anstelle der ID aus der ausgewählten Zeile eine automatisch inkrementierte ID erhält.
quelle
Klonzeile mit Aktualisierungsfeldern und automatischem Inkrementierungswert
quelle
Einige der folgenden Informationen wurden von dieser Website abgerufen. Folgendes habe ich getan, um einen Datensatz in einer Tabelle mit einer beliebigen Anzahl von Feldern zu duplizieren:
Dies setzt auch voraus, dass Sie am Anfang der Tabelle ein KI-Feld haben
quelle
Ich bin vielleicht zu spät dran, aber ich habe eine ähnliche Lösung, die für mich funktioniert hat.
Auf diese Weise muss ich keine temporäre Tabelle usw. erstellen. Da die Zeile in dieselbe Tabelle kopiert wird,
Max(PK)+1
kann die Funktion problemlos verwendet werden.Ich suchte nach einer Lösung für diese Frage (hatte die Syntax vergessen) und stellte schließlich meine eigene Frage. Komisch, wie es manchmal läuft.
Grüße
quelle
Wenn der Primärschlüssel Auto Increment ist, geben Sie einfach jedes Feld außer dem Primärschlüssel an.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
quelle
Ich habe die Lösung von @ LeonardChallis aktualisiert, da sie für mich wie keine der anderen nicht funktioniert hat. Ich habe die
WHERE
Klauseln undSET primaryKey = 0
die temporäre Tabelle entfernt, damit MySQL den primären Schlüssel automatisch inkrementiertDies dient natürlich dazu, alle Zeilen in der Tabelle zu duplizieren .
quelle
Ich habe Grims Technik mit einer kleinen Änderung verwendet: Wenn jemand nach dieser Abfrage sucht, weil er aufgrund eines Primärschlüsselproblems keine einfache Abfrage durchführen kann:
Bei meiner MySql-Installation 5.6.26 ist der Schlüssel nicht nullwertfähig und führt zu einem Fehler:
Nachdem ich eine temporäre Tabelle erstellt habe, ändere ich den Primärschlüssel in null.
quelle
Ich würde unten verwenden,
quelle
Ich habe in meiner Koha-Datenbank doppelte Elemente mit dem Präfix 'C' in die Barcode- Spalte eingefügt :
quelle
Ich musste das nur tun und das war meine manuelle Lösung:
Wenn Sie nicht wissen, was das PRIMARY- Feld ist, schauen Sie auf Ihre phpmyadmin- Seite zurück, klicken Sie auf die Registerkarte 'Struktur' und unten auf der Seite unter 'Indizes' wird angezeigt, welches 'Feld' einen 'Schlüsselnamen' hat. Wert 'PRIMARY' .
Ein bisschen weit weg, aber wenn Sie sich nicht mit Markups befassen möchten und nur eine einzelne Zeile duplizieren müssen, können Sie loslegen.
quelle
Diese oben gezeigte Lösung funktioniert auch für ausgewählte Zeilen perfekt. Zum Beispiel erstelle ich Demonstrationszeilen für mein nice2work-Projekt, und das funktioniert perfekt.
quelle
Entschuldigung für den Nekropost, aber das ist es, was ich bei Google gefunden habe. Da ich dies hilfreich, aber problematisch fand, wollte ich eine wichtige Modifikation für alle anderen beitragen, die dies ausgraben.
Zunächst einmal verwende ich SQL Server, nicht MySQL, aber ich denke, es sollte ähnlich funktionieren. Ich habe die Lösung von Leonard Challis verwendet, weil sie am einfachsten war und die Anforderungen erfüllte. Es gibt jedoch ein Problem: Wenn Sie einfach die PK nehmen und um 1 erhöhen, was passiert, wenn Sie andere Datensätze hinzugefügt haben, seit die betreffende Zeile hinzugefügt wurde . Ich entschied, dass es am besten ist, das System die automatische Inkrementierung der PK durchführen zu lassen, also habe ich Folgendes getan:
Ich glaube, dass dies in MySQL ähnlich funktionieren würde, aber ich kann das leider nicht testen
quelle
Ich weiß, dass es eine alte Frage ist, aber hier ist eine andere Lösung:
Dadurch wird eine Zeile in der Haupttabelle dupliziert, vorausgesetzt, der Primärschlüssel wird automatisch erhöht, und es werden Kopien der Daten verknüpfter Tabellen mit der neuen ID der Haupttabelle erstellt.
Weitere Optionen zum
Abrufen von Spaltennamen : -SHOW COLUMNS FROM
tablename
; (Spaltenname : Feld) -DESCRIBE
tablename
( Spaltenname : Feld)-SELECT Spaltenname FROM information_schema.columns WHERE Tabellenname = 'Tabellenname' (Spaltenname: Spaltenname)
quelle
max233 war sicherlich auf dem richtigen Weg, zumindest für den Autoincrement-Fall. Führen Sie jedoch nicht die ALTER TABLE aus. Setzen Sie einfach das Feld für die automatische Inkrementierung in der temporären Tabelle auf NULL. Dies stellt einen Fehler dar, aber das folgende EINFÜGEN aller Felder in der temporären Tabelle wird ausgeführt und das NULL-Auto-Feld erhält einen eindeutigen Wert.
quelle
Erstellen Sie eine Tabelle
Fügen Sie eine Zeile ein
Klonreiheneinfügung oben
Prüfung
quelle
Hier ist eine Antwort, die ich online auf dieser Website gefunden habe. Beschreibt, wie die oben genannten Schritte ausgeführt werden. 1 Die Antwort finden Sie unten auf der Seite. Grundsätzlich kopieren Sie die zu kopierende Zeile in eine temporäre Tabelle im Speicher. Anschließend ändern Sie die Primärschlüsselnummer mithilfe der Aktualisierung. Anschließend fügen Sie es erneut in die Zieltabelle ein. Sie lassen dann den Tisch fallen.
Dies ist der Code dafür:
Ich habe das temporäre Tabellenrettungsteam erstellt. Ich habe die Zeile aus meinem ursprünglichen Tabellen-Fitnessbericht4 kopiert. Ich habe dann den Primärschlüssel für die Zeile in der temporären Tabelle auf null gesetzt, damit ich ihn zurück in die ursprüngliche Tabelle kopieren kann, ohne einen Fehler beim doppelten Schlüssel zu erhalten. Ich habe diesen Code gestern Abend ausprobiert und es hat funktioniert.
quelle
Dies ist eine zusätzliche Lösung für die Antwort von "Grim ...". Es gab einige Kommentare dazu mit einem Primärschlüssel als null. Einige Kommentare dazu funktionieren nicht. Und einige Kommentare zu Lösungen. Keine der Lösungen hat bei uns funktioniert. Wir haben MariaDB mit der InnoDB-Tabelle.
Wir konnten den Primärschlüssel nicht so einstellen, dass er null zulässt. Die Verwendung von 0 anstelle von NULL führte zu einem doppelten Wertefehler für den Primärschlüssel.
SET SQL_SAFE_UPDATES = 0;
Hat auch nicht funktioniert.Die Lösung von "Grim ..." hat funktioniert, wenn wir stattdessen unseren PRIMARY KEY auf UNIQUE geändert haben
quelle
Ich wollte nur meinen PHP-Code veröffentlichen, weil ich denke, dass die Art und Weise, wie ich die Spalten sammle, im Code etwas sauberer ist als in den vorherigen Beispielen. Dies zeigt auch, wie Sie ein Feld leicht ändern können, in diesem Fall indem Sie eine Zeichenfolge hinzufügen. Sie können aber auch ein Fremdschlüsselfeld durch den neu hinzugefügten Datensatz ersetzen, falls Sie auch einige untergeordnete Datensätze kopieren möchten.
quelle
Für eine sehr einfache Lösung können Sie die Zeile mit PHPMyAdmin als CSV-Datei exportieren und dann einfach die geänderte CSV-Datei importieren. Bearbeiten der ID / Primärschlüssel-Spalte, um vor dem Importieren keinen Wert anzuzeigen.
Dann am Ende der Seite:
Wo "Exportieren" steht, einfach exportieren, dann die CSV-Datei bearbeiten, um den Primärschlüsselwert zu entfernen, damit er leer ist, und dann einfach in die Datenbank importieren. Beim Import wird ein neuer Primärschlüssel zugewiesen.
quelle