una tabla solo repetir registros registro pegar misma duplicar copiar consulta clonar campo cambiando sql db2

tabla - duplicar registros en una consulta sql server



¿Cómo puedo copiar un registro, cambiando solo la identificación? (5)

Tu ejemplo casi debería funcionar. Solo agregue los nombres de columna de la nueva tabla.

INSERT INTO MYTABLE (id, col1, col2) SELECT new_id,col1, col2 FROM TABLE2 WHERE ...;

Mi mesa tiene una gran cantidad de columnas. Tengo un comando para copiar algunos datos, piénselo como clonar un producto, pero como las columnas pueden cambiar en el futuro, me gustaría seleccionar solo todo de la tabla y solo cambiar el valor de una columna sin tener que hacer referencia a el resto.

Por ejemplo, en lugar de:

INSERT INTO MYTABLE ( SELECT NEW_ID, COLUMN_1, COLUMN_2, COLUMN_3, etc FROM MYTABLE)

Me gustaría algo parecido

INSERT INTO MYTABLE ( SELECT * {update this, set ID = NEW_ID} FROM MYTABLE)

¿Hay una manera simple de hacer esto?

Esta es una base de datos DB2 en un iSeries, pero las respuestas para cualquier plataforma son bienvenidas.


Podrías hacer esto:

create table mytable_copy as select * from mytable; update mytable_copy set id=new_id; insert into mytable select * from mytable_copy; drop table mytable_copy;


No creo que esto se pueda hacer completamente en SQL sin tomarse la molestia de crear una tabla temporal. Hacerlo en memoria debería ser mucho más rápido. Tenga cuidado si va por la ruta de tabla temporal que debe elegir un nombre único para su tabla para cada invocación de función para evitar la condición de carrera donde su código se ejecuta dos veces al mismo tiempo y transforma dos filas de datos en una tabla temporal.

No sé qué tipo de lenguaje está usando, pero debería ser posible obtener una lista de campos en su programa. Lo haría así:

array_of_field_names = conn->get_field__list; array_of_row_values = conn->execute ("SELECT... "); array_of_row_values ["ID"] = new_id_value insert_query_string = "construct insert query string from list of field names and values"; conn->execute (insert_query_string);

Luego puedes encapsular eso como una función y simplemente llamarlo especificando tabla, identificación anterior y nueva identificación y funcionaría es magia.

En el código de Perl, el siguiente fragmento sería:

$table_name = "MYTABLE"; $field_name = "ID"; $existing_field_value = "100"; $new_field_value = "101"; my $q = $dbh->prepare ("SELECT * FROM $table_name WHERE $field_name=?"); $q->execute ($existing_field_value); my $rowdata = $q->fetchrow_hashref; # includes field names $rowdata->{$field_name} = $new_field_value; my $insq = $dbh->prepare ("INSERT INTO $table_name (" . join (", ", keys %$rowdata) . ") VALUES (" . join (", ", map { "?" } keys %$rowdata) . ");"; $insq->execute (values %$rowdata);

Espero que esto ayude.


Nunca he trabajado con db2 pero en mssql puedes resolverlo con el siguiente procedimiento. esta solución solo funciona si no te importa qué nueva identificación obtienen los artículos.

1.) crear una nueva tabla con el mismo esquema, pero donde la columna de identificación se incrementa automáticamente. (mssql "especificación de identidad = 1, incremento de identidad = 1)

2.) que un simple

insert into newTable(col1, col2, col3) select (col1, col2, col3) from oldatable

debería ser suficiente, asegúrese de no incluir su columna de id en la declaración anterior


Ok, intenta esto:

declare @othercols nvarchar(max); declare @qry nvarchar(max); select @othercols = ( select '', '' + quotename(name) from sys.columns where object_id = object_id(''tableA'') and name <> ''Field3'' and is_identity = 0 for xml path('''')); select @qry = ''insert mynewtable (changingcol'' + @othercols + '') select newval'' + @othercols; exec sp_executesql @qry;

Antes de ejecutar la línea "sp_executesql", haga "seleccionar @qry" para ver cuál es el comando que va a ejecutar.

Y, por supuesto, es posible que desee incluir esto en un procedimiento almacenado y pasar una variable en lugar del bit ''Field3''.

Robar