Pregunta

Estoy haciendo una base de datos SQL que almacena contactos. Quiero poder eliminar contactos, y la identificación correcta para cada contacto es crucial para que mi software se conecte a él. Digamos que tengo contacto con James y él es el primero. Su identificación es 0. Agrego a Mary y su identificación es 1. Si elimino a James, ¿cómo se puede establecer la identificación de Mary en 0 en lugar de permanecer en 1? Tiene que reiniciarse ya que ella es la primera ahora. En otras palabras, ¿cómo puedo restablecer todas las ID en la base de datos cuando alguien se elimina? Gracias

¿Fue útil?

Solución

No tiene sentido hacer esto en una columna de clave principal de incremento automático, como si fuera trivial, sin actualizaciones masivas en las tablas relacionadas afecta la integridad de sus datos. Para hacerlo, es probable que deba eliminar el índice y la restricción de la clave principal de la columna (en cuyo momento su aplicación puede descartarse), renumerar todos los registros posteriores, renumerar todas las tablas relacionadas y luego volver a aplicar la restricción de clave principal y el índice.

Si realmente debe tener alguna forma de identificador lineal que siempre comienza en 0 (esto puede indicar un problema con el diseño del software), entonces puede tener una columna de ID secundaria además de la clave principal, que luego actualiza a baraja valores más altos en un peldaño con una declaración como:

UPDATE table
SET secondaryID = secondaryID - 1
WHERE secondaryID > (SELECT secondaryID FROM table WHERE primaryID = [id to delete]);

DELETE FROM table
WHERE primaryID = [id to delete];

Desaconsejo encarecidamente esta práctica: si sus ID son valores 'perdidos' debido a registros eliminados, el software debe probar la existencia de estos valores en lugar de simplemente eliminarlos.

Otros consejos

Esta es una mala idea en muchos sentidos. Estoy debatiendo si debo mostrarle cómo hacer esto. Nunca debería haber una razón para cambiar la identidad de una fila una vez que se establece.

Si existe, probablemente esté utilizando el campo incorrecto como su identificador PK. Aquí supongo que está hablando de su campo PK, que también es una columna de identidad.

Tenga en cuenta que si crea tablas que se vinculan a su tabla de contactos y comienza a cambiar su ID, también necesita actualizar todas esas tablas. Lo que se volverá caro ...

Eso se volverá muy lento una vez que tenga más de una cantidad trivial de registros en la base de datos. La columna de identidad no funcionará para usted, debe hacer algunos tsql personalizados para seguir cambiando todos los números, pero es una muy mala idea, en mi opinión.

¿Por qué no utilizar un sello de fecha / hora si necesita realizar un seguimiento de los pedidos que se agregaron?

Necesita repensar su diseño.

Así no es como funcionan los ID, y no cómo deberían funcionar. El ID nunca debe cambiar, o toda la información vinculada apuntaría a la fila incorrecta.

En cambio, ¿por qué no agregar un " External_ID " columna que controlas? O numerarlos dinámicamente en su consulta (¿con una columna calculada?)

El ID es el identificador único de la fila.

Se puede usar para vincular una fila a otra fila en otra tabla. La ausencia de ID también contiene información en sí misma, ya que claramente diría que fue eliminada. Comenzar a reciclar números de identificación anula por completo el propósito de tener un identificador único, y realmente no tiene ningún sentido. Una vez que se asigna una ID a una fila, no debe cambiarla arbitrariamente.

Imagine por un segundo que cuando alguien muere, le entrega su número de seguro social (ID) a otra persona. Eso dará como resultado la transferencia de toda la información anterior que estaba vinculada al número de seguro social de la persona fallecida a esa nueva persona, lo cual no tiene ningún sentido. Lo mismo ocurre con las ID, si una ID se reasigna, heredará cualquier información anterior que se haya vinculado previamente a ella.

Esto se resolvería mucho mejor utilizando otro método que renumerar la columna de identidad cada vez que se elimina una fila.

Es difícil decir exactamente qué más haría sin saber por qué su aplicación tiene esta necesidad, pero el hecho de que su aplicación necesite esta funcionalidad es probablemente indicativo de un problema de diseño en alguna parte.

Estás usando identificadores como algo más que un identificador. Si ese es el caso, no podrá utilizar un campo de incremento automático. Tendrá que manejar esto en su código.

Una búsqueda en Google de 1 minuto me dio una página que no puedo mostrar. Google esto y será su primer enlace a partir del 01/06/2009: tsql fix & Quot; columna de identidad & Quot;

Esencialmente, sugeriría agregar una restricción de clave externa entre todos sus campos relacionales al campo de ID en cuestión antes de volver a numerar (lo cual también es una idea horrible si hay alguna relación, estrictamente porque si está preguntando esta pregunta, tendrás muchísimo tiempo).

Si su tabla de contactos es su ÚNICA tabla o tiene relaciones CERO basadas en este campo ID, puede establecer la propiedad Identity en NO, renumerar los valores de 1 a COUNT (ID), luego establecer la propiedad Identity en YES, y reinicializar la identidad para completar usando:

DECLARAR @MaxID INT

SELECT @MaxID = COUNT (ID) FROM TableID

DBCC CHECKIDENT ('TableID', RESEED, @MaxID)

En este escenario, podría usar el script de reinicio anterior después de cada conjunto de eliminaciones (pero cambie COUNT (ID) a MAX (ID) una vez que todo esté configurado inicial y correctamente, esto agrega un poco de velocidad a medida que la tabla se hace más grande ), antes de cualquier inserción adicional o actualización de restricciones de clave externa. Asegúrese de usar TRANSACCIONES envueltas alrededor de los bloques de borrado y reposición, y asegúrese de que la tabla solo permita transacciones síncronas, esto evitará que se alojen datos en el medio de los reenganches.

Complejo eh? Por eso es mejor comenzar con el pie derecho. ;) (Aprendí esto por experiencia) Envíeme un correo electrónico a mraarone et yahoo d0t com si tiene más preguntas.

Escribí una aplicación para manejar un programa de ventas multinivel. Por supuesto, la gente abandona. En el nuestro, la gente también tenía que ser insertada.

Estás en el camino correcto con una modificación.

El número de identidad (ID) y el número de secuencia (seq) son dos cosas diferentes. No tienen ninguna relación entre ellos en absoluto.

Nunca cambie una identificación. Una vez asignado, siempre asignado.

Cree una columna (cNEXT) en su tabla para la secuencia y llénela con ID. " ¿Qué ID será el próximo en esta secuencia? "

Mezcle las ID en cNEXT, reasignando cNEXT, en cualquier momento que desee. Cualquier proceso almacenado puede hacer eso.

Entonces también tiene la flexibilidad de crear cadenas de ID no secuenciales. Esto es útil cuando las personas se mudan a diferentes regiones u obtener promociones para diferentes grupos.

¡Espero que esto ayude! :)

Todas las respuestas suponen que este es un entorno de producción. Si está probando un diseño de base de datos, entonces desea truncar rápidamente todas las tablas, debería haber una manera fácil de lograr esto:

DBCC CHECKIDENT ({nombre de tabla}, reseed, 0)

* Eliminar todas las filas de todas las tablas usando la identificación primero

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top