En MySQL estoy tratando de copiar una fila con un incremento automático column ID=1
e insertar los datos en la misma tabla con una nueva fila column ID=2
.
¿Cómo puedo hacer esto en una sola consulta?
Uso 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
2, inclúyalo en su lista de columnas INSERT y su SELECT:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Tendrás que ocuparte de un posible duplicado id
de 2 en el segundo caso, por supuesto.
En mi opinión, lo mejor parece usar sentencias sql solo para copiar esa fila, mientras que al mismo tiempo solo hace referencia a las columnas que debe y desea cambiar.
Consulte también av8n.com - Cómo clonar un registro SQL
Beneficios:
your_table
en una operación atómica.fuente
Error Code: 1113. A table must have at least 1 column
.SET id=NULL
puede causar un errorColumn 'id' cannot be null
. Debería ser reemplazado porUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Digamos que la mesa es
user(id, user_name, user_email)
.Puedes usar esta consulta:
fuente
Result: near "SELECT": syntax error
Esto ayudó y admite columnas BLOB / TEXT.
fuente
Para una solución rápida y limpia que no requiera que nombre columnas, puede usar una declaración preparada como se describe aquí: https://stackoverflow.com/a/23964285/292677
Si necesita una solución compleja para poder hacer esto con frecuencia, puede usar este procedimiento:
Puedes ejecutarlo con:
Ejemplos
DESCARGO DE RESPONSABILIDAD: Esta solución es solo para alguien que repetidamente repetirá filas en muchas tablas, a menudo. Podría ser peligroso en manos de un usuario deshonesto.
fuente
También puede pasar '0' como valor para que la columna se incremente automáticamente, se usará el valor correcto cuando se cree el registro. Esto es mucho más fácil que las tablas temporales.
Fuente: Copiar filas en MySQL (ver el segundo comentario, por TRiG, a la primera solución, por Lore)
fuente
Muchas respuestas geniales aquí. A continuación se muestra una muestra del procedimiento almacenado que escribí para realizar esta tarea para una aplicación web que estoy desarrollando:
fuente
fuente
Si puede usar MySQL Workbench, puede hacerlo haciendo clic con el botón derecho en la fila y seleccionando 'Copiar fila', y luego haciendo clic con el botón derecho en la fila vacía y seleccionando 'Pegar fila', y luego cambiando la ID, y luego haciendo clic en 'Aplicar'.
Copia la fila:
Pegue la fila copiada en la fila en blanco:
Cambiar la identificación:
Aplicar:
fuente
Estaba buscando la misma función pero no uso MySQL. Quería copiar TODOS los campos excepto, por supuesto, la clave principal (id). Esta fue una consulta de una sola vez, que no se utilizará en ningún script o código.
Encontré mi camino con PL / SQL, pero estoy seguro de que cualquier otro IDE de SQL lo haría. Hice un básico
Luego expórtelo a un archivo SQL donde podría encontrar el
Simplemente lo edité y lo usé:
fuente
Tiendo a usar una variación de lo que mu es demasiado corto publicado:
Siempre que las tablas tengan campos idénticos (excepto el incremento automático en la tabla de registro), esto funciona bien.
Como uso procedimientos almacenados siempre que sea posible (para facilitar la vida a otros programadores que no están demasiado familiarizados con las bases de datos), esto resuelve el problema de tener que volver y actualizar los procedimientos cada vez que agrega un nuevo campo a una tabla.
También garantiza que si agrega nuevos campos a una tabla, comenzarán a aparecer en la tabla de registro inmediatamente sin tener que actualizar las consultas de su base de datos (a menos que, por supuesto, tenga algunas que establezcan un campo explícitamente)
Advertencia: querrá asegurarse de agregar nuevos campos a ambas tablas al mismo tiempo para que el orden de los campos permanezca igual ... de lo contrario, comenzará a obtener errores extraños. Si usted es el único que escribe interfaces de base de datos Y tiene mucho cuidado, entonces esto funciona bien. De lo contrario, mantén el nombre de todos tus campos.
Nota: Pensándolo bien, a menos que esté trabajando en un proyecto en solitario que esté seguro de que no habrá otros trabajando en él, adhiérase a la lista explícita de todos los nombres de campo y actualice sus declaraciones de registro a medida que cambia su esquema. Este atajo probablemente no valga el dolor de cabeza a largo plazo que puede causar ... especialmente en un sistema de producción.
fuente
fuente
Vuelque la fila que desea sql y luego use el SQL generado, menos la columna ID para importarlo nuevamente.
fuente