MySQL: come copiare le righe, ma modificare alcuni campi?


195

Ho un gran numero di righe che vorrei copiare, ma devo cambiare un campo.

Posso selezionare le righe che voglio copiare:

select * from Table where Event_ID = "120"

Ora voglio copiare tutte quelle righe e creare nuove righe durante l'impostazione di Event_IDa 155. Come posso ottenere questo?

Risposte:


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

Qui, col2, ... rappresentano le colonne rimanenti (quelle diverse da Event_ID) nella tabella.


39
c'è un modo per farlo senza dover specificare i nomi delle colonne?
Andrew,

4
Non che ne sia consapevole. Naturalmente, se la tua tabella ha come 1000 colonne o qualcosa del genere e non vuoi digitarle tutte, allora potresti scrivere un'istruzione SQL per creare la tua istruzione SQL :). Il modo in cui lo faresti sarebbe usare information_schema per ottenere i nomi delle colonne per la tabella. Ma è davvero eccessivo, scriverei semplicemente i nomi delle colonne.
dcp,

3
Questo sarebbe possibile utilizzando un asterisco per ottenere le colonne rimanenti?
Peter,

2
Accesso effettuato per l'upgrade solo per scoprire che l'ho già votato. Immagino che questo mi abbia salvato diverse volte ora :) Grazie!
aexl

2
@Bitterblue - Scusa, non capisco il tuo commento. Non ho mai detto che col2, ... erano colonne che non vuoi copiare, ho appena detto che rappresentano le colonne rimanenti dal tavolo. È ovvio che verranno copiati, altrimenti non sarebbero affatto nell'istruzione SQL.
dcp,

141

Questa è una soluzione in cui hai molti campi nella tua tabella e non vuoi ottenere un crampo da dito digitando tutti i campi, basta digitare quelli necessari :)

Come copiare alcune righe nella stessa tabella, con alcuni campi con valori diversi:

  1. Crea una tabella temporanea con tutte le righe che desideri copiare
  2. Aggiorna tutte le righe nella tabella temporanea con i valori desiderati
  3. Se si dispone di un campo di incremento automatico, è necessario impostarlo su NULL nella tabella temporanea
  4. Copia tutte le righe della tabella temporanea nella tabella originale
  5. Elimina la tabella temporanea

Il tuo codice:

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

Codice scenario generale:

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

Codice semplificato / condensato:

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;

Poiché la creazione della tabella temporanea utilizza la TEMPORARYparola chiave, questa verrà automaticamente eliminata al termine della sessione (come suggerito da @ ar34z).


7
MySQL supporta la TEMPORARYparola chiave per creare tabelle temporanee. L'utilizzo di CREATE TEMPORARY TABLEeliminerà automaticamente la tabella al termine della sessione (una serie di query SQL). Eliminare la tabella non sarebbe necessario e non è in conflitto con altre tabelle temporanee con lo stesso nome. (ad es. quando l'hacking dal vivo (che non consiglierei))
ar34z,

1
questo codice funziona solo se l'utente #temporary_table invece di temporary_table, forse un problema MSSQL?
TruthOf42

16
Fondamentalmente ha funzionato perfettamente per me, ma ho dovuto superare un vincolo Not Null sulla chiave primaria nella tabella temporanea che sembra essere copiato dalla tabella originale. Ho risolto questo problema modificando la tabella temporanea prima dell'aggiornamento come segue: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; L'aggiornamento della chiave primaria a Null non avrebbe avuto esito negativo.
Snorris,

1
Non riesco a farlo funzionare in PostgreSQL 9.4: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Ho provatoALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000 il

1
Ho provato con diverse versioni di MySQL e MariaDB. Funziona perfettamente per me e preferisco questa versione alla risposta accettata, che in realtà accade abbastanza spesso qui :)
hexerei software

41

Supponiamo che il tuo tavolo abbia altre due colonne: foo e bar

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

4
c'è un modo per farlo senza dover specificare i nomi delle colonne?
Andrew,

@PeterBailey Nuovo in MySQL, potresti chiarire come funziona il codice: /
3kstc

10

Se hai un sacco di colonne nella tua tabella e non vuoi scrivere ognuna di esse puoi farlo usando una tabella temporanea, come;

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
una nota: questo presuppone che non ci sia una chiave primaria nella tabella
kommradHomer,

2

Ehi, che ne dici di copiare tutti i campi, cambiarne uno con lo stesso valore + qualcos'altro.

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

??????????


0

Finché Event_ID è intero, procedere come segue:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.