insert into table select * from table where primarykey=1
Solo quiero copiar una fila para insertarla en la misma tabla (es decir, quiero duplicar una fila existente en la tabla) pero quiero hacer esto sin tener que enumerar todas las columnas después de "seleccionar", porque esta tabla tiene Demasiadas columnas.
Pero cuando hago esto, me sale el error:
Entrada duplicada 'xxx' para la clave 1
Puedo manejar esto creando otra tabla con las mismas columnas que un contenedor temporal para el registro que quiero copiar:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
¿Hay una manera más simple de resolver esto?
mysql
copy
duplicates
row
lina
fuente
fuente
max(oldtable.id) + oldtable_temp.key
esto para asegurarme de que los identificadores se incrementen y sean únicos.Respuestas:
Utilicé la técnica de Leonard Challis con algunos cambios:
Como tabla temporal, nunca debe haber más de un registro, por lo que no tiene que preocuparse por la clave principal. Establecerlo como nulo permite a MySQL elegir el valor en sí mismo, por lo que no hay riesgo de crear un duplicado.
Si desea estar súper seguro de que solo está insertando una fila, puede agregar LIMIT 1 al final de la línea INSERT INTO.
Tenga en cuenta que también agregué el valor de la clave primaria (1 en este caso) a mi nombre de tabla temporal.
fuente
tmptable_1
vs.tmptable
)primarykey
INT NULL; después de la primera línea para hacer que la solución funcioneActualización 07/07/2014 - La respuesta basada en mi respuesta, por Grim ... , es una mejor solución, ya que mejora mi solución a continuación, por lo que sugeriría usar eso.
Puede hacerlo sin enumerar todas las columnas con la siguiente sintaxis:
Puede decidir cambiar la clave principal de otra manera.
fuente
tmptable
, no necesita agregar laWHERE primarykey = 2
declaración para la última línea también. (Es decir, soloINSERT INTO table SELECT * FROM tmptable
.)¿Asumo que quieres que el nuevo disco tenga uno nuevo
primarykey
? Siprimarykey
esAUTO_INCREMENT
así, simplemente haz esto:... donde
col1, col2, col3, ...
están todas las columnas de la tabla, exceptoprimarykey
.Si no es una
AUTO_INCREMENT
columna y desea poder elegir el nuevo valorprimarykey
, es similar:... donde
567
está el nuevo valor paraprimarykey
.fuente
Casi lo tuvo con su primera consulta, solo necesita especificar las columnas, de esa manera puede excluir su clave principal en la inserción, lo que promulgará el incremento automático que probablemente tenga en la tabla para crear automáticamente una nueva clave primaria para el entrada.
Por ejemplo, cambie esto:
A esto:
Simplemente no incluya la columna de clave primaria en la lista de columnas para INSERT o para las partes SELECT de la consulta.
fuente
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
o algo similar?También puede intentar volcar la tabla, encontrar el comando de inserción y editarlo:
El
--skip-extended-insert
le da un comando de inserción por fila. Luego puede encontrar la fila en su editor de texto favorito, extraer el comando y alterar la clave primaria a "predeterminada".fuente
Este procedimiento supone que:
Por supuesto, esto no es perfecto, pero en ciertos casos (probablemente la mayoría) funcionará.
fuente
works
pero el enfoque es sólido y tiene valor porque es único aquí y en realidad aborda la pregunta del OP.Esto se puede lograr con algo de creatividad:
Esto dará como resultado que la nueva fila obtenga una identificación con incremento automático en lugar de la identificación de la fila seleccionada.
fuente
Si el campo de clave principal de su tabla es un campo de incremento automático, puede usar la consulta con columnas. Por ejemplo, su tabla llamada
test_tbl
tiene 3 campos comoid, name, age
.id
es un campo de clave principal y un incremento automático, por lo que puede usar la siguiente consulta para duplicar la fila:Esta consulta da como resultado la duplicación de cada fila.
Si el campo de clave principal de su tabla no es un campo de incremento automático, puede usar el siguiente método:
El resultado de esta consulta es una fila duplicada de
id=19
insertada comoid=20
.fuente
tableName
(fieldName1
,fieldName2
,fieldName3
) SELECTfieldName1
,fieldName2
,fieldName3
DEtableName
DONDE 1 (para copiar todos ellos a la vez)fila de clonación con campos de actualización y valor de incremento automático
fuente
Algunos de los siguientes fueron extraídos de este sitio. Esto es lo que hice para duplicar un registro en una tabla con cualquier número de campos:
Esto también supone que tiene un campo AI al comienzo de la tabla
fuente
Utilicé la técnica de Grim con un pequeño cambio: si alguien que busca esta consulta es porque no puede hacer una consulta simple debido a un problema de clave principal:
Con mi instalación de MySql 5.6.26, la clave no es anulable y produce un error:
Entonces, después de crear una tabla temporal, cambio la clave principal para que sea anulable.
fuente
Podría llegar tarde en esto, pero tengo una solución similar que me ha funcionado.
De esta manera, no necesito crear una tabla temporal, etc. Como la fila se copia en la misma tabla, la
Max(PK)+1
función se puede usar fácilmente.Vine buscando la solución de esta pregunta (había olvidado la sintaxis) y terminé haciendo mi propia consulta. Es curioso cómo las cosas funcionan algunas veces.
Saludos
fuente
Si la clave primaria es Incremento automático, solo especifique cada campo excepto la clave primaria.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
fuente
Actualicé la solución de @ LeonardChallis ya que no funcionó para mí como ninguna de las otras. Eliminé las
WHERE
cláusulas ySET primaryKey = 0
la tabla temporal para que MySQL se incremente automáticamente como la clave principalPor supuesto, esto es para duplicar todas las filas de la tabla.
fuente
Yo usaría a continuación,
fuente
Utilicé en mi base de datos Koha para insertar elementos duplicados con el prefijo 'C' en la columna de código de barras :
fuente
Solo tenía que hacer esto y esta era mi solución manual:
Si no sabe cuál es el campo PRIMARIO , mire hacia atrás en su página de phpmyadmin , haga clic en la pestaña 'Estructura' y en la parte inferior de la página debajo de 'Índices' le mostrará qué 'Campo' tiene un 'Nombre de clave' valor 'PRIMARIO' .
Es un largo camino, pero si no desea lidiar con el marcado y solo necesita duplicar una sola fila, listo.
fuente
Esta solución mostrada anteriormente funciona perfecto también para filas seleccionadas. Por ejemplo, estoy creando filas de demostración para mi proyecto nice2work, y esto funciona perfectamente.
fuente
Perdón por el necropost, pero esto es lo que encontré con google y desde que encontré esto útil pero problemático, quería aportar una modificación importante para cualquier otra persona que desentierre esto.
En primer lugar, estoy usando SQL Server, no MySQL, pero creo que debería funcionar de manera similar. Utilicé la solución de Leonard Challis porque era más simple y satisfacía la necesidad, sin embargo, hay un problema con esto: si simplemente toma el PK y lo incrementa en 1, entonces, ¿qué sucede si ha agregado otros registros desde que se agregó la fila en cuestión? . Decidí que era mejor dejar que el sistema manejara el incremento automático de la PK, así que hice lo siguiente:
Creo que esto funcionaría de manera similar en MySQL, pero no puedo probar esto, lo siento
fuente
Sé que es una vieja pregunta, pero aquí hay otra solución:
Esto duplica una fila en la tabla principal, suponiendo que la clave primaria es de incremento automático, y crea copias de datos de tablas vinculadas con la nueva identificación de la tabla principal.
Otras opciones para obtener nombres de columna:
-MOSTRAR COLUMNAS DE
tablename
; (Nombre de columna: Campo)-DESCRIBIR
tablename
(Nombre de columna: Campo)-SELECCIONAR nombre_columna DESDE información_esquema.columnas DONDE nombre_tabla = 'nombre_tabla' (Nombre de columna: nombre_columna)
fuente
max233 ciertamente estaba en el camino correcto, al menos para el caso de autoincremento. Sin embargo, no haga la TABLA DE ALTERACIÓN. Simplemente establezca el campo de incremento automático en la tabla temporal en NULL. Esto presentará un error, pero ocurrirá el siguiente INSERT de todos los campos en la tabla temporal y el campo automático NULL obtendrá un valor único.
fuente
Crear una tabla
Insertar una fila
Insertar fila de clones arriba
Prueba
fuente
Aquí hay una respuesta que encontré en línea en este sitio Describe cómo hacer lo anterior 1 Puede encontrar la respuesta en la parte inferior de la página. Básicamente, lo que debe hacer es copiar la fila que se copiará en una tabla temporal guardada en la memoria. Luego, cambia el número de la clave principal mediante la actualización. Luego lo vuelve a insertar en la tabla de destino. Luego dejas caer la mesa.
Este es el código para ello:
Creé la tabla temporal de equipo de rescate. Copié la fila de mi tabla original fitnessreport4. Luego configuré la clave principal para la fila en la tabla temporal como nula para poder copiarla de nuevo a la tabla original sin obtener un error de clave duplicada. Intenté este código ayer por la noche y funcionó.
fuente
Esta es una solución adicional a la respuesta de "Grim ..." Ha habido algunos comentarios sobre que tiene una clave primaria como nula. Algunos comentarios al respecto no funcionan. Y algunos comentarios sobre soluciones. Ninguna de las soluciones funcionó para nosotros. Tenemos MariaDB con la tabla InnoDB.
No pudimos establecer la clave primaria para permitir nulo. El uso de 0 en lugar de NULL condujo a un error de valor duplicado para la clave primaria.
SET SQL_SAFE_UPDATES = 0;
Tampoco funcionó.La solución de "Grim ..." funcionó SI cambiamos nuestra CLAVE PRIMARIA a ÚNICA
fuente
Solo quería publicar mi fragmento de código PHP, porque creo que la forma en que recopilo las columnas es un poco más limpia en el código que los ejemplos anteriores. Además, esto muestra cómo podría alterar fácilmente un campo, en este caso agregando una cadena. Pero también puede reemplazar un campo de clave externa con el registro recién agregado, en caso de que desee copiar también algunos registros secundarios.
fuente
Para una solución muy simple, puede usar PHPMyAdmin para exportar la fila como un archivo CSV y luego simplemente importar el archivo CSV modificado. Edición de la columna ID / clave principal para no mostrar ningún valor antes de importarlo.
Luego, al final de la página:
Donde dice "Exportar" simplemente exporte, luego edite el archivo csv para eliminar el valor de la clave primaria, de modo que esté vacío, y luego simplemente impórtelo a la base de datos, se asignará una nueva clave primaria en la importación.
fuente