Kopieren Sie die Zeile aber mit neue id
Ich habe eine Tabelle "test" mit einem auto erhöht id
und eine beliebige Anzahl von Spalten.
Möchte ich eine Kopie einer Zeile in dieser Tabelle mit allen Spalten die gleichen, außer für die id
natürlich.
Gibt es eine Möglichkeit, dies zu tun, ohne den Namen aller Spalten?
Dachte ich INSERT... SELECT... ON DUPLICATE KEY
würde mir helfen, bis ich gemerkt habe, dass es nie eine INSERT ON DUPLICATE
es nur updates der vorhandenen Zeile.
- Duplikat von : stackoverflow.com/questions/729489/... ?
- Nein, es ist nicht doppelt. OP nicht verwenden möchten
ON DUPLICATE ...
und die genannten posten verwendetupdate
, die OP nicht wollen. - Wo hat der OP gesagt, er will nicht aktualisieren? Der von Ihnen genannte Beitrag ist genau das, was er tun will. Eine Kopie einer Zeile und OHNE den Namen ALLER SPALTEN an.
- OP sagt: "... bis ich merkte, dass Sie es nie macht ein insert on duplicate, sind es nur updates der vorhandenen Zeile."
- Und, wenn Sie tatsächlich Lesen Sie den genannten Beitrag, die zweite Frage ist die Antwort, die die Verwendung einer temporären Tabelle. Sie können es nicht tun ohne den Namen aller Spalten auf andere Weise, die die OP nicht will. temp-Tabelle, Zeile einfügen, update-id, legen Sie in der ersten Tabelle.
- Ja @JohnP, ist hier genau richtig.
- OK. Problem mit
auto_increment
. Aktualisieren einer id in der tmp-Tabelle ist möglicherweise nicht nützlich sein, wenn kopiert Haupt-Tabelle. Da aktualisiert pk-Feld könnte der Wert bereits vorhanden sein, in der Haupt-Tabelle. Tim Ruehsen's Antwort, in der genannten post, die am besten für diese Anforderung. - Ja, ich werde mit Tim Ruehsen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns sagen, dass Ihre Tabelle hat folgende Felder:
dann kopieren Sie Werte aus einer Zeile zu der anderen Zeile mit dem neuen Schlüssel Wert,
folgende Abfrage kann helfen,
Erzeugt dies einen neuen Wert für
pk_id
Feldes und Werte kopieren voncol1
, undcol2
von der ausgewählten Zeile.Können Sie dieses Beispiel erweitern, um mehr Felder in der Tabelle.
UPDATE:
In gebührender Beachtung der Kommentare von JohnP und Martin -
Wir können eine temporäre Tabelle, um zunächst mit dem Puffer aus der Haupt-Tabelle und verwenden Sie es zu kopieren, um Haupt-Tabelle wieder.
Bloßes update von pk-reference-Feld in der temp-Tabelle wird nicht helfen, da es möglicherweise bereits in der Haupt-Tabelle. Stattdessen können wir uns fallen die pk-Feld aus der temp-Tabelle und kopieren Sie alle anderen auf die Haupt-Tabelle.
Mit Verweis auf die Antwort von Tim Ruehsen in der gemäß Buchung:
Hoffe, das hilft.
ALTER TABLE
bewirkt eine implizite Transaktion zu Begehen, obwohl es über eine temporäre Tabelle. Und, tatsächlich, Sie tun solltenDROP TEMPORARY TABLE tmp;
zu vermeiden, dass dieselben auf die Letzte Zeile, wenn es zu spät ist bis dahin.Dies funktioniert in MySQL alle Versionen und Amazon RDS Aurora:
oder
Aber nicht in MariaDB, getestet habe ich version 10.
0
, nichtNULL
? Ich würde gerne wissen, wie man diese Arbeit machen Mobil.NULL
sowie0
.DIESE ARBEITEN ZUM DUPLIZIEREN EINER ZEILE NUR
Code:
Natürlich sollten Sie verwenden, PDO:bindparam und überprüfen Sie Ihre Variablen gegen-Angriff, etc
aber gibt das Beispiel
zusätzliche info
Wenn Sie ein problem mit der Handhabung
NULL
Werte können Sie verwenden folgende codes, so dassimploding
Namen und Werte nur für die, deren Wert nichtNULL
.NULL
Werte mit dieser Lösung?je nachdem, wie viele Spalten es sind, könnten Sie einfach den Namen der Spalten, sans-ID, und fügen Sie manuell eine ID oder, wenn es in deiner Tabelle, eine sekundäre ID (sid):
insert into PROG(date, level, Percent, sid) select date, level, Percent, 55 from PROG where sid = 31
Hier, wenn sid 31 hat mehr als eine daraus resultierende Reihe, alle von Ihnen werden kopiert über 55 sid und Ihre auto-iDs werden immer noch automatisch generiert.
für die ID nur:
insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31
dem 55 ist die nächste verfügbare ID in der Tabelle und die ID 31 ist, die Sie kopieren möchten.