registros - copiar tablas mysql workbench
MySQL: ¿Cómo copiar filas, pero cambiar algunos campos? (6)
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_ID
en 155
. ¿Cómo puedo lograr esto?
Digamos que su 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"
Esta es una solución donde tienes muchos campos en tu mesa y no quieres que te toque un dedo escribir todos los campos, solo escribe los que necesites :)
Cómo copiar algunas filas en la misma tabla, con algunos campos que tienen valores diferentes:
- Crea una tabla temporal con todas las filas que quieras copiar
- Actualice todas las filas en la tabla temporal con los valores que desee
- Si tiene un campo de incremento automático, debe establecerlo en NULL en la tabla temporal
- Copie todas las filas de la tabla temporal en su tabla original
- 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 usa la palabra clave TEMPORARY
, se eliminará automáticamente cuando finalice la sesión (como se sugirió @ ar34z).
Oye, ¿qué tal copiar todos los campos, cambiar uno de ellos al mismo valor + algo más?
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
FROM Table
WHERE Event_ID = "120"
??????????
Si tiene muchas columnas en su tabla y no desea escribirlas, 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
Siempre que 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"
INSERT INTO Table
( Event_ID
, col2
...
)
SELECT "155"
, col2
...
FROM Table WHERE Event_ID = "120"
Aquí, col2, ... representa las columnas restantes (las que no sean Event_ID) en su tabla.