¿Cómo copiar una fila e insertarla en la misma tabla con un campo de incremento automático en MySQL?
En MySQL, estoy intentando copiar una fila con un incremento automático column ID=1
e insertar los datos en la misma tabla como una nueva fila con column ID=2
.
¿Cómo puedo hacer esto en una sola consulta?
Usar INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
donde c1, c2, ...
están todas las columnas excepto id
. Si desea insertar explícitamente con un id
valor de 2, inclúyalo en su lista de columnas INSERTAR y en su SELECCIONAR:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Tendrás que encargarte de un posible duplicado id
de 2 en el segundo caso, por supuesto.
En mi opinión, lo mejor parece usar declaraciones SQL solo para copiar esa fila, mientras que al mismo tiempo solo hace referencia a las columnas que debes y deseas cambiar.
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=0; /* Update other values at will. */
INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;
Véase también av8n.com - Cómo clonar un registro SQL
Beneficios:
- Las declaraciones SQL 2 mencionan sólo los campos que deben cambiarse durante el proceso de clonación. No conocen –ni les importan– otros campos. Los otros campos simplemente siguen el camino, sin cambios. Esto hace que las declaraciones SQL sean más fáciles de escribir, más fáciles de leer, más fáciles de mantener y más extensibles.
- Sólo se utilizan declaraciones MySQL ordinarias. No se requieren otras herramientas o lenguajes de programación.
- Se inserta un registro completamente correcto en
your_table
una operación atómica.
Digamos que la mesa es user(id, user_name, user_email)
.
Puede utilizar esta consulta:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Esto ayudó y admite columnas BLOB/TEXT.
CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;
USE source_table;