MySQL: ¿Cómo copiar filas, pero cambiar algunos campos?

195

Tengo una gran cantidad de filas que me gustaría copiar, pero necesito cambiar un campo.

Puedo seleccionar las filas que quiero copiar:

select * from Table where Event_ID = "120"

Ahora quiero copiar todas esas filas y crear nuevas filas mientras configuro Event_IDa 155. ¿Cómo puedo lograr esto?

Andrés
fuente

Respuestas:

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

Aquí, el col2, ... representa las columnas restantes (las que no sean Event_ID) en su tabla.

dcp
fuente
39
¿Hay alguna manera de hacerlo sin tener que especificar los nombres de columna?
Andrew
44
No que yo supiese. Por supuesto, si su tabla tiene como 1000 columnas o algo así y no desea escribirlas todas, entonces podría escribir una declaración SQL para construir su declaración SQL :). La forma en que lo haría sería utilizar el esquema de información para obtener los nombres de columna para la tabla. Pero eso es realmente exagerado, simplemente escribiría los nombres de las columnas.
dcp
3
¿Sería posible usar un asterisco para obtener las columnas restantes?
Peter
2
Ingresé para votar solo para descubrir que ya lo he votado. Supongo que esto me salvó varias veces :) ¡Gracias!
aexl
2
@Bitterblue - Lo siento, no entiendo tu comentario. Nunca dije col2, ... eran columnas que no quieres copiar, solo dije que representan las columnas restantes de la tabla. Es obvio que se copiarán, de lo contrario, no estarían en la declaración SQL.
dcp
140

Esta es una solución en la que tiene muchos campos en su tabla y no desea que se le caigan los dedos al escribir todos los campos, simplemente escriba los necesarios :)

Cómo copiar algunas filas en la misma tabla, con algunos campos que tienen valores diferentes:

  1. Cree una tabla temporal con todas las filas que desea copiar.
  2. Actualice todas las filas de la tabla temporal con los valores que desee.
  3. Si tiene un campo de incremento automático, debe establecerlo en NULL en la tabla temporal
  4. Copie todas las filas de la tabla temporal en su tabla original
  5. Eliminar la tabla temporal

Tu codigo:

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

Código de escenario general:

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

Código simplificado / condensado:

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;

Como la creación de la tabla temporal utiliza la TEMPORARYpalabra clave, se eliminará automáticamente cuando finalice la sesión (como sugiere @ ar34z).

Alex Christodoulou
fuente
77
MySQL admite la TEMPORARYpalabra clave para crear tablas temporales. El uso de CREATE TEMPORARY TABLEautomáticamente eliminará la tabla cuando finalice la sesión (una serie de consultas SQL). Dejar la tabla no sería necesario y no entra en conflicto con otras tablas temporales que usan el mismo nombre. (por ejemplo, cuando pirateo en vivo (que no recomendaría))
ar34z
1
este código solo funciona si usas #temporary_table en lugar de temporary_table, ¿quizás sea un problema de MSSQL?
TruthOf42
16
Esto básicamente funcionó perfectamente para mí, pero tuve que superar una restricción Not Null en la clave primaria en la tabla temporal que parece copiarse de la tabla original. Solucioné esto alterando la tabla temporal antes de la actualización de la siguiente manera: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Luego, la actualización de la clave primaria a Null no fallaría.
snorris
1
No puedo conseguir que funcione en PostgreSQL 9.4: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Lo intentéALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000
1
Probé con diferentes versiones de MySQL y MariaDB. Funciona perfecto para mí y prefiero esta versión a la respuesta aceptada, que en realidad sucede muy a menudo aquí :)
el software Hexerei
41

Digamos que su mesa tiene otras dos columnas: foo y bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"
Peter Bailey
fuente
44
¿Hay alguna manera de hacerlo sin tener que especificar los nombres de columna?
Andrew
@PeterBailey Nuevo en MySQL, ¿podría arrojar algo de luz sobre cómo funciona el código: /
3kstc
10

Si tiene muchas columnas en su tabla y no desea escribir cada una, puede hacerlo usando una tabla temporal, como;

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp
Davethebfg
fuente
66
una nota: esto supone que usted no tiene ninguna clave primaria en la tabla
kommradHomer
2

Hola, ¿qué tal copiar todos los campos, cambiar uno de ellos al mismo valor + otra cosa?

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

??????????

Dimitar
fuente
0

Mientras Event_ID sea Integer, haga esto:

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