2010-05-06 20 views
140

Tengo una gran cantidad de filas que me gustaría copiar, pero necesito cambiar un campo.MySQL: ¿Cómo copiar filas, pero cambiar algunos campos?

puedo seleccionar las filas que desea copiar:

select * from Table where Event_ID = "120" 

Ahora quiero copiar todas las filas y crear nuevas filas mientras se ajusta la Event_ID a 155. ¿Cómo puedo lograr esto?

Respuesta

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

Aquí, el col2, ... representan las columnas restantes (los distintos Event_ID) en su mesa.

+19

¿hay alguna manera de hacerlo sin tener que especificar los nombres de las columnas? – Andrew

+3

No es que yo sepa. Por supuesto, si su tabla tiene como 1000 columnas o algo así y no quiere 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 information_schema para obtener los nombres de columna para la tabla. Pero eso es realmente exagerado, solo escribiría los nombres de las columnas. – dcp

+1

exactamente el ejemplo que necesitaba, gracias. No estaba seguro si podrías hacerlo de esa manera. – salonMonsters

33

Digamos que la tabla tiene otras dos columnas: foo y bar

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

¿hay alguna forma de hacerlo sin tener que especificar los nombres de las columnas? – Andrew

+0

¡Gracias! Tu solución lo hizo por mí. :) – Woppi

+0

¡Buen ejemplo, corto dulce y completo! –

2

Oye cómo va a copiar todos los campos, cambiar uno de ellos en el mismo valor + algo más.

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

??????????

9

Si tiene un montón de columnas en la tabla y no desea escribir cada una, puede hacerlo utilizando 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 
+5

una nota: esto supone que no tiene una clave principal en su tabla – kommradHomer

105

Esta es una solución en la que tiene muchos campos de la tabla y no quiere conseguir un calambre dedo de haber escrito todos los campos, sólo tienes que escribir los necesarios :)

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

  1. Crear una tabla temporal con todas las filas que desea copiar
  2. Actualizar todas las filas de la tempora tabla ry con los valores que desee
  3. Si usted tiene un campo de incremento automático, deberá ajustar a NULL en la tabla temporal
  4. copiar todas las filas de la tabla temporal en la tabla original
  5. eliminar la tabla temporal

Su código:

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 general de escenario:

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 creación de la tabla temporal utiliza la palabra clave TEMPORARY que será dado de baja automáticamente cuando finaliza la sesión (como @ ar34z sugerido).

+0

Gracias, Alex. Este código funcionó para mí. – TecBrat

+6

MySQL admite la palabra clave 'TEMPORARY' para crear tablas temporales. El uso de 'CREATE TEMPORARY TABLE' caerá automágicamente en la tabla cuando finalice la sesión (una serie de consultas SQL). Dejar caer la tabla no sería necesario y no entra en conflicto con otras tablas temporales que usan el mismo nombre. (por ejemplo, cuando hackeo en vivo (que no recomendaría)) – ar34z

+1

este código solo funciona si usa #temporary_table en lugar de temporary_table, ¿tal vez un problema MSSQL? – TruthOf42

0

Mientras Event_ID es entero, hacer esto:

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