varios valores update una tabla registros modificar insertar eliminar ejemplos datos como comando actualizar sql sql-server sql-server-2005 tsql

valores - insertar datos en una tabla sql



¿Cómo se copia un registro en una tabla SQL pero se intercambia el ID único de la nueva fila? (9)

Esta pregunta se acerca mucho a lo que necesito, pero mi escenario es ligeramente diferente. La tabla fuente y la tabla de destino son las mismas y la clave primaria es un identificador único (guid). Cuando intento esto:

insert into MyTable select * from MyTable where uniqueId = @Id;

Obviamente recibo una violación de restricción de clave principal, ya que intento copiar la clave primaria. En realidad, no quiero copiar la clave primaria en absoluto. Por el contrario, quiero crear uno nuevo. Además, me gustaría copiar selectivamente sobre ciertos campos, y dejar los otros nulos. Para hacer las cosas más complejas, necesito tomar la clave principal del registro original e insertarla en otro campo en la copia (campo Id. Anterior).

Estoy seguro de que hay una solución fácil para esto, simplemente no sé lo suficiente de TSQL para saber de qué se trata.


Especifique todos los campos excepto su campo ID.

INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId) SELECT FIELD2, NULL, ..., FIELD529, FIELD1 FROM MyTable WHERE FIELD1 = @Id;


Mi tabla tiene 100 campos y necesitaba una consulta para simplemente trabajar. Ahora puedo cambiar cualquier número de campos con alguna lógica condicional básica y no preocuparme por su posición ordinal.

  1. Reemplace el nombre de la tabla siguiente con el nombre de su tabla

    SQLcolums = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = ''TABLE-NAME'')" Set GetColumns = Conn.Execute(SQLcolums) Do WHILE not GetColumns.eof colName = GetColumns("COLUMN_NAME")

  2. Reemplace el nombre del campo de identidad original con su nombre de campo PK

    IF colName = "ORIGINAL-IDENTITY-FIELD-NAME" THEN '' ASSUMING THAT YOUR PRIMARY KEY IS THE FIRST FIELD DONT WORRY ABOUT COMMAS AND SPACES columnListSOURCE = colName columnListTARGET = "[PreviousId field name]" ELSE columnListSOURCE = columnListSOURCE & colName columnListTARGET = columnListTARGET & colName END IF GetColumns.movenext loop GetColumns.close

  3. Reemplace los nombres de la tabla nuevamente (tanto el nombre de la tabla de destino como el nombre de la tabla fuente); edita tus condiciones where

    SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" Conn.Execute(SQL)


Ok, sé que es un problema antiguo, pero publico mi respuesta de todos modos.

Me gusta esta solución. Solo tengo que especificar la (s) columna (s) de identidad.

SELECT * INTO TempTable FROM MyTable_T WHERE id = 1; ALTER TABLE TempTable DROP COLUMN id; INSERT INTO MyTable_T SELECT * FROM TempTable; DROP TABLE TempTable;

La columna "id" es la columna de identidad y esa es la única columna que debo especificar. Es mejor que al revés de todos modos. :-)

Yo uso SQL Server. Puede usar " CREATE TABLE " y " UPDATE TABLE " en la fila 1 y 2. Hmm, vi que realmente no le di la respuesta que quería. Él quería copiar la identificación a otra columna también. Pero esta solución es buena para hacer una copia con una nueva identificación automática.

Edito mi solución con los idéas de Michael Dibbets.

use MyDatabase; SELECT * INTO #TempTable FROM [MyTable] WHERE [IndexField] = :id; ALTER TABLE #TempTable DROP COLUMN [IndexField]; INSERT INTO [MyTable] SELECT * FROM #TempTable; DROP TABLE #TempTable;

Puede soltar más de una columna separándolas con un ",". El ID: debe ser reemplazado por el ID de la fila que desea copiar. MyDatabase, MyTable e IndexField deben reemplazarse con sus nombres (por supuesto).


Prueba esto:

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

Cualquier campo no especificado debe recibir su valor predeterminado (que generalmente es NULL cuando no está definido).


Puedes hacer así:

INSERT INTO DENI/FRIEN01P SELECT RCRDID+112, PROFESION, NAME, SURNAME, AGE, RCRDTYP, RCRDLCU, RCRDLCT, RCRDLCD FROM FRIEN01P

Allí, en lugar de 112, debe poner un número de identificación máxima en la tabla DENI / FRIEN01P.


Si "clave" es su campo PK y es autonumérico.

insert into MyTable (field1, field2, field3, parentkey) select field1, field2, null, key from MyTable where uniqueId = @Id

generará un nuevo registro, copiando campo1 y campo2 del registro original


Supongo que intentas evitar escribir todos los nombres de las columnas. Si está utilizando SQL Management Studio, puede hacer clic con el botón derecho en la tabla y Script As Insertar ... luego puede perder el tiempo con esa salida para crear su consulta.


Tengo el mismo problema cuando quiero que una sola secuencia de comandos funcione con una tabla que tiene columnas agregadas periódicamente por otros desarrolladores. No solo eso, sino que también soporto muchas versiones diferentes de nuestra base de datos, ya que es posible que los clientes no estén todos actualizados con la versión actual.

Tomé la solución por Jonas y la modifiqué un poco. Esto me permite hacer una copia de la fila y luego cambiar la clave principal antes de volver a agregarla a la tabla fuente original. Esto también es muy útil para trabajar con tablas que no permiten valores NULL en columnas y no desea tener que especificar el nombre de cada columna en el INSERT.

Este código copia la fila para ''ABC'' a ''XYZ''

SELECT * INTO #TempRow FROM SourceTable WHERE KeyColumn = ''ABC''; UPDATE #TempRow SET KeyColumn = ''XYZ''; INSERT INTO SourceTable SELECT * FROM #TempRow; DELETE #TempRow;

Una vez que haya terminado, suelte la tabla temporal.

DROP TABLE #TempRow;


insert into MyTable (uniqueId, column1, column2, referencedUniqueId) select NewGuid(), // don''t know this syntax, sorry column1, column2, uniqueId, from MyTable where uniqueId = @Id