primary modificar foreign ejemplo drop create autoincrement sql primary-key

modificar - primary key mysql ejemplo



volver a numerar clave principal (6)

¿Cómo puedo restablecer el contador de clave principal en una tabla sql y actualizar cada fila con una nueva clave principal?


¿Por qué te molestas? El objetivo de las claves primarias de "identidad" basadas en contador es que los números son arbitrarios y sin sentido.


Agregaría otra columna a la tabla primero, rellene eso con la nueva PK.

Luego usaría las declaraciones de actualización para actualizar los nuevos campos fk en todas las tablas relacionadas.

Entonces puedes soltar los viejos campos PK y viejos fk.

EDITAR: Sí, como Ian dice que tendrá que soltar y luego volver a crear todas las restricciones de clave externa.


Esto puede o no ser específico de MS SQL, pero: TRUNCATE TABLE restablece el contador de identidad, por lo que una forma de hacerlo rápida y sucia sería 1) Hacer una copia de seguridad 2) Copiar los contenidos de la tabla a la tabla temporal: 3) Copiar los contenidos de la tabla temporal volver a la tabla (que tiene la columna de identidad):

SELECT Field1, Field2 INTO #MyTable FROM MyTable TRUNCATE TABLE MyTable INSERT INTO MyTable (Field1, Field2) SELECT Field1, Field2 FROM #MyTable SELECT * FROM MyTable ----------------------------------- ID Field1 Field2 1 Value1 Value2


Si este es el SQL Server de Microsoft, una cosa que podría hacer es usar el [dbcc checkident] ( http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)

Supongamos que tiene una sola tabla en la que desea mover datos junto con renumerar las claves principales. Por ejemplo, el nombre de la tabla es ErrorCode . Tiene dos campos, ErrorCodeID (que es la clave principal) y una Descripción .

Código de ejemplo usando dbcc checkident

-- Reset the primary key counter dbcc checkident(ErrorCode, reseed, 7000) -- Move all rows greater than 8000 to the 7000 range insert into ErrorCode select Description from ErrorCode where ErrorCodeID >= 8000 -- Delete the old rows delete ErrorCode where ErrorCodeID >= 8000 -- Reset the primary key counter dbcc checkident(ErrorCode, reseed, 8000)

Con este ejemplo, efectivamente moverá todas las filas a una clave principal diferente y luego las restablecerá para que la siguiente inserción tome una ID 8000.

¡Espero que esto ayude un poco!


No estoy seguro de qué DBMS está utilizando, pero si es SQL Server:

SET IDENTITY_INSERT [MyTable] ON

le permite actualizar / insertar la columna de clave principal. Luego, cuando haya terminado de actualizar las teclas (puede usar un CURSOR para esto si la lógica es complicada)

SET IDENTITY_INSERT [MyTable] OFF

¡Espero que ayude!


puedes hacerlo en los siguientes pasos:

  • crea una copia de yourTable con columna adicional new_key
  • llene copyOfYourTable con las filas afectadas de su tabla junto con los valores deseados de new_key
  • deshabilitar temporalmente las restricciones
  • actualice todas las tablas relacionadas para apuntar al valor de new_key en lugar de old_key
  • eliminar las filas afectadas de su tabla
  • SET IDENTITY_INSERT [yourTable] ENCENDIDO
  • inserte las filas afectadas nuevamente con el nuevo valor apropiado de la clave (de la tabla de copias)
  • SET IDENTITY_INSERT [yourTable] OFF
  • identidad resembrada
  • volver a habilitar las restricciones
  • eliminar el copyOfYourtable

Pero como otros dijeron que todo ese trabajo no es necesario. Tiendo a mirar las claves primarias del tipo de identidad como si fueran equivalentes de punteros en C, los uso para hacer referencia a otros objetos pero nunca modificarlos para acceder a ellos explícitamente