MySQL: Wie kopiere ich Zeilen, ändere aber ein paar Felder?

195

Ich habe eine große Anzahl von Zeilen, die ich kopieren möchte, aber ich muss ein Feld ändern.

Ich kann die Zeilen auswählen, die ich kopieren möchte:

select * from Table where Event_ID = "120"

Jetzt möchte ich alle diese Zeilen kopieren und neue Zeilen zu erstellen , während der Einstellung Event_IDzu 155. Wie kann ich das erreichen?

Andrew
quelle

Antworten:

278
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

Hier repräsentiert col2, ... die verbleibenden Spalten (die anderen als Event_ID) in Ihrer Tabelle.

dcp
quelle
39
Gibt es eine Möglichkeit, dies zu tun, ohne die Spaltennamen angeben zu müssen?
Andrew
4
Nicht dass ich wüsste. Wenn Ihre Tabelle 1000 Spalten oder ähnliches enthält und Sie nicht alle eingeben möchten, können Sie natürlich eine SQL-Anweisung schreiben, um Ihre SQL-Anweisung zu erstellen :). Sie würden dies tun, indem Sie das information_schema verwenden, um die Spaltennamen für die Tabelle abzurufen. Aber das ist wirklich übertrieben, ich würde nur die Spaltennamen eingeben.
DCP
3
Wäre dies mit einem Stern möglich, um die verbleibenden Spalten abzurufen?
Peter
2
Zum Upvoten angemeldet, nur um herauszufinden, dass ich dies bereits upvoted habe. Ich denke, das hat mich jetzt mehrmals gerettet :) Danke!
Aexl
2
@Bitterblue - Entschuldigung, ich verstehe Ihren Kommentar nicht. Ich habe nie gesagt, dass col2, ... Spalten sind, die Sie nicht kopieren möchten. Ich habe nur gesagt, dass sie die verbleibenden Spalten aus der Tabelle darstellen. Es ist offensichtlich, dass sie kopiert werden, sonst wären sie überhaupt nicht in der SQL-Anweisung enthalten.
dcp
140

Dies ist eine Lösung, bei der Sie viele Felder in Ihrer Tabelle haben und keine Fingerkrämpfe durch die Eingabe aller Felder bekommen möchten. Geben Sie einfach die benötigten Felder ein :)

So kopieren Sie einige Zeilen in dieselbe Tabelle, wobei einige Felder unterschiedliche Werte haben:

  1. Erstellen Sie eine temporäre Tabelle mit allen Zeilen, die Sie kopieren möchten
  2. Aktualisieren Sie alle Zeilen in der temporären Tabelle mit den gewünschten Werten
  3. Wenn Sie ein Feld für die automatische Inkrementierung haben, sollten Sie es in der temporären Tabelle auf NULL setzen
  4. Kopieren Sie alle Zeilen der temporären Tabelle in Ihre ursprüngliche Tabelle
  5. Löschen Sie die temporäre Tabelle

Dein Code:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Allgemeiner Szenariocode:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Vereinfachter / komprimierter Code:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

Da die Erstellung der temporären Tabelle das TEMPORARYSchlüsselwort verwendet, wird sie nach Beendigung der Sitzung automatisch gelöscht (wie von @ ar34z vorgeschlagen).

Alex Christodoulou
quelle
7
MySQL unterstützt das TEMPORARYSchlüsselwort zum Erstellen temporärer Tabellen. Die Verwendung von CREATE TEMPORARY TABLEwird die Tabelle automatisch löschen, wenn die Sitzung (eine Reihe von SQL-Abfragen) beendet ist. Das Löschen der Tabelle wäre nicht erforderlich und steht nicht in Konflikt mit anderen temporären Tabellen mit demselben Namen. (zB beim Live-Hacking (was ich nicht empfehlen würde))
ar34z
1
Dieser Code funktioniert nur, wenn Sie #temporary_table anstelle von temporär_table verwenden, möglicherweise ein MSSQL-Problem?
TruthOf42
16
Dies funktionierte im Grunde perfekt für mich, aber ich musste eine Not Null-Einschränkung für den Primärschlüssel in der temporären Tabelle überwinden, die scheinbar aus der ursprünglichen Tabelle kopiert wurde. Ich habe dies behoben, indem ich die temporäre Tabelle vor dem Update wie folgt geändert habe: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Dann würde das Update des Primärschlüssels auf Null nicht fehlschlagen.
Snorris
1
Ich kann es in PostgreSQL 9.4 nicht zum Laufen bringen : Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Ich habe versuchtALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000
1
Ich habe mit verschiedenen MySQL- und MariaDB-Versionen getestet. Funktioniert perfekt für mich und ich ziehe diese Version der akzeptierten Antwort vor, was hier eigentlich ziemlich oft vorkommt :)
Hexerei Software
40

Angenommen, Ihre Tabelle enthält zwei weitere Spalten: foo und bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"
Peter Bailey
quelle
4
Gibt es eine Möglichkeit, dies zu tun, ohne die Spaltennamen angeben zu müssen?
Andrew
@ PeterBailey Neu in MySQL, könnten Sie bitte etwas Licht in die Funktionsweise des Codes bringen: /
3kstc
10

Wenn Ihre Tabelle viele Spalten enthält und Sie nicht jede Spalte eingeben möchten, können Sie dies mithilfe einer temporären Tabelle tun, z.

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp
Davethebfg
quelle
6
ein Hinweis: Dies setzt voraus, dass Sie keinen Primärschlüssel in Ihrer Tabelle haben
kommradHomer
2

Hey, wie wäre es, alle Felder zu kopieren, eines davon auf den gleichen Wert + etwas anderes zu ändern.

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????

Dimitar
quelle
0

Solange Event_ID Integer ist, gehen Sie folgendermaßen vor:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
axel.becker
quelle