2010-03-15 9 views
5

Tengo una tabla con CreateDate datetime campo default(getdate()) que no tiene ninguna columna de identidad.¿Cómo controlar el orden de asignación para la nueva columna de identidad en SQL Server?

Me gustaría agregar el campo identity(1,1) que reflejaría el mismo orden de registros existentes como CreateDate campo (order by daría los mismos resultados). ¿Cómo puedo hacer eso?

Supongo que si creo una clave agrupada en el campo CreateDate y luego agrego una columna de identidad, funcionará (no estoy seguro de si está garantizado), ¿hay una buena/mejor manera?

Tengo interés en SQL Server 2005, pero supongo que la respuesta será la misma para SQL Server 2008, SQL Server 2000.

Respuesta

8

raíz de teórico respuesta de Remus ... que necesita para generar una lista con su primer pedido ideales

SELECT 
    ID, CreateDate 
INTO 
    MyNewTable 
FROM 
    (
    SELECT 
     CreateDate, 
     ROW_NUMBER() OVER (ORDER BY CreateDate ASC) AS ID 
    FROM 
     MyTable 
    ) foo 

Entonces, la mejor solución es utilizar SSMS para añadir la propiedad IDENTITY a MiNuevaTabla . SSMS va a generar un guión que incluye SET IDENTITY INSERT para preservar el orden

Nota: Las columnas de identidad son sólo números que no tienen significado implícito y nada debe ser inferida por su alineación con el CreateDate después de este ejercicio ...

1

Como se sospecha, los añadirá según el índice agrupado. De lo contrario, tendrás que hacerlo en código de alguna parte.

+2

No, no lo hará. Solo una cláusula ORDER BY garantizará una ORDEN – gbn

+0

@gbn Cada vez que inserte una columna de identidad, el orden de los autonumeros coincidió con el índice agrupado. He contado con este comportamiento para obtener el orden que deseaba. ¿Estás diciendo que este comportamiento no está garantizado y que podría no suceder, que he tenido suerte? –

+0

@Patrick: IDENTITY puede dejar huecos, está documentado en MSDN: "Si existe una columna de identidad para una tabla con eliminaciones frecuentes, pueden existir espacios vacíos entre los valores de identidad". –

2

Los valores de IDENTIDAD son ortogonales a la orden física de almacenamiento en general. En particular, una identidad no siempre coincidirá con un orden de clave agrupada de fecha y hora debido a la resolución de fecha y hora de 3 ms que permite varias filas con la misma fecha y hora. Además, si la hora original está vinculada a la máquina cliente (es decir, capa intermedia, capa ASP, máquina de usuario, etc.), la deriva de tiempo entre máquinas también asegurará una diferencia entre el orden de inserción (qué IDENTIDAD daría) y el orden de almacenamiento.

Si necesita un entero de orden de fila, use ROW_NUMBER() en la lista de proyección. Si necesita una clave primaria de IDENTIDAD para ORM, use una columna de IDENTIDAD e indexe como un índice no agrupado.

Nunca confunda el requisito de almacenamiento físico (clave agrupada) con los requisitos de modelado lógico (clave principal).

+0

Si rechaza, explique por qué, como una cortesía básica. –

+0

Lo siento, ese soy yo. No creo que hayas respondido la pregunta. Estoy * de acuerdo * con sus declaraciones (excepto que mis columnas de Identidad son casi siempre el índice agrupado), pero no son útiles. Quiere mejorar su diseño/claridad/indexación/foreignKeys agregando un campo de autonumeración; He estado en esta situación varias veces. Estoy seguro de que desearía haber tenido un autonumber para empezar. En lugar de números aleatorios para empezar, le gustaría que al menos * un tanto * coincidan con el orden en que se agregaron. Mejor que nada. Cómo hacer eso fue su pregunta. –

+0

Sí, pero ¿qué sucederá * a continuación *, después de que él agregue la columna de identidad? Su estimado mapa de valores de identidad física de orden desaparecerá en 5 minutos. Toda mi publicación es acerca de cómo * nunca * confiar en tal mapeo. –

Cuestiones relacionadas