2010-09-27 20 views
5

"Sólo puede haber una columna de identidad por tabla""Solo puede haber una columna de IDENTIDAD por mesa" - ¿Por qué?

¿Por qué es así? Tome el escenario de un vehículo, existe un número de chasis que es único, así como el número de registro que resulta ser único. Para representar este escenario en sql server necesitamos una implementación personalizada para una de las columnas. Por el contrario, en Oracle puede tener tantas secuencias como desee en una tabla. ¿Por qué hay una restricción en la Columna de IDENTIDAD, por alguna razón específica?

El escenario de tener un esquema de vehículo es algo imaginario me estoy preguntando por qué hay una restricción en la columna de identidad.

+1

¿Realmente importa? –

+0

Quiero saber por qué no es posible. – Chaitanya

+2

Porque los ingenieros en el equipo de SQL Server o no podían hacerlo, o no pensaron que era una buena idea hacerlo. –

Respuesta

8

Una columna de identidad en SQL Server tiene una semilla y un incremento automático. Siempre podríamos calcular cuál sería el segundo valor de identificación hipotética si supiéramos el valor de la primera columna de identificación de todos modos.

p. Ej. Si se trataba de sintaxis legal

create table #foo 
(
bar int identity(1,10), 
baz int identity(1000,1) 
) 

Nosotros no necesitamos almacenar Baz, ya que podría ser calculado a partir de barras de la siguiente manera.

baz = 1000 + (bar-1)/10 
+1

¡maldito por expresar lo que estaba tratando de decir! – DForck42

2

Los datos se almacenan en la base de datos, codificados por la columna IDENTITY. Una sola columna de este tipo permite un almacenamiento similar al del sistema de archivos. Tener múltiples columnas IDENTITY podría confundir el problema.

Mi recomendación es elegir una de sus columnas para ser el IDENTITY o PRIMARY KEY, y para el otro ser un UNIQUE KEY. Como usuario no habrá diferencia, pero hará que el DBMS sea feliz.

5

Porque sería el mismo valor. si tuviera identidad (1,1) como el principal, y la identidad (100,2), se llega a los siguientes resultados:

1  100 
2  102 
3  104 
4  106 
5  108 
6  110 
7  112 
8  114 
9  116 
10 118 

usted podría conseguir la segunda columna al hacer esto:

((ID-1) * 2) +100

es una ecuación lineal, entonces ¿cuál sería el punto que no sea para mostrar?

+0

Mis pensamientos exactamente. – ErikE

+0

Los valores de IDENTIDAD no siempre se asignan en secuencia, sin embargo. Si tiene dos insertos simultáneos de múltiples filas, los valores pueden intercalarse entre los dos conjuntos de filas. Además, se pueden insertar valores específicos para que las dos columnas no dependan entre sí. Solo un par de razones por las que podría querer dos columnas de IDENTIDAD. – sqlvogel

+1

@dportas, claro, pero en teoría, si tuviera 2 identidades, ambas se asignarían al mismo tiempo, sin dejar de darle el mismo efecto. – DForck42

1
  • Las secuencias de Oracle no son columnas de SQL Server IDENTITY: usted escribe algún código para ellas. Ellos no trabajan fuera de la caja basado en el DDL CREATE TABLE
  • Cualquier columnas IDENTITY posteriores se pueden resolver desde la primera (Edit: Como otra gente ha mencionado)
0

Es una limitación tonto Estoy de acuerdo. Sin embargo, no es demasiado difícil evitarlo. Simplemente cree una tabla separada con una columna de IDENTIDAD para utilizarla puramente como generador de secuencias. Inserte en la tabla de secuencias, recupere el valor usando SCOPE_IDENTITY() e inserte el valor donde desee. A continuación, puede admitir tantas secuencias como necesite.

1

El motivo no se explica en MSDN que pude encontrar.Sin embargo, sospecho que tiene que ver con la forma en que el servidor sql implementa la columna de identidad. Conceptualmente, creo que es más una configuración o valor a nivel de tabla que a nivel de columna y la columna es solo una forma de acceder al valor. Creo que esto porque todos los métodos para interactuar con valores de identidad tienen la tabla como parámetro y no la columna, por ejemplo. IDENT_SEED, IDENT_CURRENT e IDENT_INCR. Si fuera una configuración de nivel de columna, los parámetros incluirían un nombre de columna. Si tenía más de una columna de identidad en la tabla, esas funciones no funcionarían.

Sin embargo, estoy especulando.

Cuestiones relacionadas