una registro primaria partir numero modificar llave insertar crear como columna campos autoincrementable autoincrement auto_increment mysql sql insert copy

mysql - primaria - insertar registro auto_increment sql



¿Cómo copiar una fila e insertarla en la misma tabla con un campo de autoincrement en MySQL? (11)

Estaba buscando la misma característica pero no uso MySQL. Quería copiar TODOS los campos, excepto, por supuesto, la clave principal (id). Esta fue una consulta de un solo uso, no para ser utilizada en ningún script o código.

Encontré mi camino con PL / SQL, pero estoy seguro de que cualquier otro SQL IDE lo haría. Hice un básico

SELECT * FROM mytable WHERE id=42;

Luego exportarlo a un archivo SQL donde pude encontrar el

INSERT INTO table (col1, col2, col3, ... , col42) VALUES (1, 2, 3, ..., 42);

Acabo de editarlo y lo usé:

INSERT INTO table (col1, col2, col3, ... , col42) VALUES (mysequence.nextval, 2, 3, ..., 42);

Tengo una tabla Eg-tab. Lo que intento hacer es copiar una fila con una columna autoincrement ID = 1 e insertar los datos en la misma tabla con una fila y columna ID = 2.

Usando MySql. ¿Cómo puedo hacer esto en una sola consulta? Por favor ayuda


IMO, el 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.

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY SELECT * FROM your_table WHERE id=1; UPDATE temp_table SET id=NULL; /* Update other values at will. */ INSERT INTO your_table SELECT * FROM temp_table; DROP TABLE temp_table;

Consulte también av8n.com - Cómo clonar un registro SQL

Beneficios:

  • Las sentencias SQL 2 mencionan solo los campos que deben modificarse durante el proceso de clonación. No conocen ni se preocupan por otros campos. Los otros campos solo continúan para el viaje, 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.
  • Solo se utilizan sentencias MySQL ordinarias. No se requieren otras herramientas o lenguajes de programación.
  • Se inserta un registro completamente correcto en your_table en una operación atómica.

Para una solución rápida y limpia que no requiera el nombre de columnas, puede usar una declaración preparada como se describe aquí: https://.com/a/23964285/292677

Si necesita una solución compleja para poder hacerlo a menudo, puede utilizar este procedimiento:

DELIMITER $$ CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text) SQL SECURITY INVOKER BEGIN SELECT IF(TRIM(_omitColumns) <> '''', CONCAT(''id'', '','', TRIM(_omitColumns)), ''id'') INTO @omitColumns; SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns; SET @sql = CONCAT(''INSERT INTO '', _tableName, ''('', @columns, '')'', ''SELECT '', @columns, '' FROM '', _schemaName, ''.'', _tableName, '' '', _whereClause); PREPARE stmt1 FROM @sql; EXECUTE stmt1; END

Puede ejecutarlo con:

CALL duplicateRows(''database'', ''table'', ''WHERE condition = optional'', ''omit_columns_optional'');

Ejemplos

duplicateRows(''acl'', ''users'', ''WHERE id = 200''); -- will duplicate the row for the user with id 200 duplicateRows(''acl'', ''users'', ''WHERE id = 200'', ''created_ts''); -- same as above but will not copy the created_ts column value duplicateRows(''acl'', ''users'', ''WHERE id = 200'', ''created_ts,updated_ts''); -- same as above but also omits the updated_ts column duplicateRows(''acl'', ''users''); -- will duplicate all records in the table

DESCARGO DE RESPONSABILIDAD: Esta solución es solo para alguien que repetirá repetidamente filas en muchas tablas, a menudo. Podría ser peligroso en manos de un usuario deshonesto.


Supongamos que la tabla es user(id, user_name, user_email) .

Puedes usar esta consulta:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)


También puede pasar ''0'' como el valor de la columna para autoincrementar, el valor correcto se usará 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)


Tiendo a usar una variación de lo que mu es demasiado corto publicado:

INSERT INTO something_log SELECT NULL, s.* FROM something AS s WHERE s.id = 1;

Siempre que las tablas tengan campos idénticos (excepto el incremento automático en la tabla de registro), esto funciona bien.

Como utilizo 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 atrás 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, estos comenzarán a aparecer en la tabla de registro inmediatamente sin tener que actualizar sus consultas a la base de datos (a menos que, por supuesto, tenga algunos que establezcan un campo explícitamente)

Advertencia: deseará 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 recibir errores extraños. Si usted es el único que escribe interfaces de bases de datos Y tiene mucho cuidado, esto funciona muy bien. De lo contrario, adhiérase a nombrar todos sus campos.

Nota: Pensándolo bien, a menos que trabaje en un proyecto en solitario del que esté seguro no tendrá a otros trabajando, cúmplalo para enumerar todos los nombres de campo explícitamente y actualice sus instrucciones de registro a medida que cambia su esquema. Este atajo probablemente no valga la pena a largo plazo que pueda causar ... especialmente en un sistema de producción.


Vuelque la fila que desea sql y luego use el SQL generado, menos la columna ID para importarlo nuevamente.


esto me ayudó mucho 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 INSERT ... SELECT :

insert into your_table (c1, c2, ...) select c1, c2, ... from your_table where id = 1

donde c1, c2, ... son todas las columnas excepto id . Si desea insertar explícitamente con una id de 2, inclúyalo en su lista de columnas INSERTAR y SELECCIONE:

insert into your_table (id, c1, c2, ...) select 2, c1, c2, ... from your_table where id = 1

Tendrás que ocuparte de una posible id duplicada de 2 en el segundo caso, por supuesto.


INSERT INTO `dbMyDataBase`.`tblMyTable` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) SELECT NULL, `Column2`, `Column3`, ''CustomValue'' AS Column4 FROM `dbMyDataBase`.`tblMyTable` WHERE `tblMyTable`.`Column2` = ''UniqueValueOfTheKey'' ; /* mySQL 5.6 */


insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id;