¿Cómo copiar una fila e insertarla en la misma tabla con un campo de incremento automático en MySQL?

Resuelto Navdroid asked hace 12 años • 16 respuestas

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?

Navdroid avatar Feb 06 '12 13:02 Navdroid
Aceptado

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 idvalor 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 idde 2 en el segundo caso, por supuesto.

mu is too short avatar Feb 06 '2012 06:02 mu is too short

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_tableuna operación atómica.
parvus avatar Oct 12 '2012 06:10 parvus

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)
Vijay avatar Feb 06 '2012 06:02 Vijay

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;
Petr Hladík avatar Aug 14 '2015 08:08 Petr Hladík