2009-05-20 18 views
6

¿Por qué el servidor Sql no permite más de una columna IDENTIDAD en una tabla? Alguna razón especificacolumna de identidad en el servidor Sql

+0

La respuesta aceptada es incorrecta sobre el motivo. Incluso si te permitiera crear dos columnas de identidad, de todos modos no serviría de nada [como aquí] (http://stackoverflow.com/a/3807400/73226) –

Respuesta

2
columna

una identidad es una columna (también conocido como campo) en una tabla de la base de que: -

  1. identifica de forma única cada fila de la tabla
  2. se compone de valores generados por la base de datos

Esto es muy parecido a un campo Autonumérico en Microsoft Access o una secuencia en Oracle.

Una columna de identidad difiere de una clave principal en que el servidor gestiona sus valores y (excepto en casos excepcionales) no se puede modificar. En muchos casos, se utiliza una columna de identidad como clave principal, sin embargo, este no es siempre el caso.

El servidor SQL usa la columna de identidad como el valor clave para referirse a una fila en particular. Por lo tanto, solo se puede crear una sola columna de identidad. Además, si no se indican explícitamente columnas de identidad, el servidor Sql almacena internamente una columna separada que contiene el valor clave para cada fila. Como se indicó, si desea que más de una columna tenga un valor único, puede utilizar la palabra clave UNIQUE.

+0

"Una columna Identity ... Identifica de manera única cada fila en la tabla" - ¿En serio? ¿Por qué entonces es esto posible ?: CREATE TABLE Test1 (col1 INTEGER IDENTITY); SET IDENTITY_INSERT Test1 ON; INSERT INTO Test1 (col1) VALUES (1); INSERT INTO Test1 (col1) VALUES (1); SET IDENTITY_INSERT Test1 OFF; SELECCIONE col1 FROM Test1 – onedaywhen

+1

... entonces si SQL Server permite que la columna IDENTITY contenga duplicados, ¿cómo podría ser cierto que "SQL Server usa la columna de identidad como valor clave para referirse a una fila en particular"? – onedaywhen

+0

Onedaywhen, tus comentarios no tienen sentido. SQL Server no permite que una columna de identidad contenga duplicados. – Lisa

0

El propósito de una columna de identidad es que contendrá un valor único para cada fila de la tabla. Entonces, ¿por qué necesitarías más de uno de ellos en una mesa determinada?

Quizás necesite aclarar su pregunta, si tiene una necesidad real de más de una.

+0

¿De verdad? ¿Por qué entonces es esto posible ?: CREATE TABLE Test1 (col1 INTEGER IDENTITY) ; SET IDENTITY_INSERT Test1 ON ; INSERT INTO Test1 (col1) VALUES (1) ; INSERT INTO Test1 (col1) VALUES (1) ; SET IDENTITY_INSERT Test1 OFF ; SELECCIONE col1 FROM Test1 ; – onedaywhen

7

¿Por qué lo necesitarías? SQL Server realiza un seguimiento de un valor único (valor de identidad actual) para cada tabla con IDENTITY columna por lo que puede tener una sola columna de identidad por tabla.

0

Una columna de identidad se utiliza para identificar de forma única una sola fila de una tabla. Si desea que otras columnas sean exclusivas, puede crear un índice ÚNICO para cada columna de "identidad" que pueda necesitar.

+0

¿De verdad? ¿Por qué entonces es esto posible ?: CREATE TABLE Test1 (col1 INTEGER IDENTITY); SET IDENTITY_INSERT Test1 ON; INSERT INTO Test1 (col1) VALUES (1); INSERT INTO Test1 (col1) VALUES (1); SET IDENTITY_INSERT Test1 OFF; SELECCIONE col1 FROM Test1 – onedaywhen

2

El servidor SQL almacena la identidad en una tabla interna, utilizando el ID de la tabla como su clave. Por lo tanto, es imposible que SQL Server tenga más de una columna de identidad por tabla.

-1

Siempre he visto esto como una limitación arbitraria y mala para SQL Server. Sí, solo quiere una columna de identidad para identificar realmente una fila, pero hay razones válidas por las que desea que la base de datos genere automáticamente un número para más de un campo en la base de datos.

Eso es lo bueno de las secuencias en Oracle. No están atados a una mesa. Puede usar varias secuencias diferentes para rellenar tantos campos como desee en la misma tabla. Usted podría también tienen más de una mesa compartiendo la misma secuencia, aunque esa es probablemente una decisión realmente mala. Pero el punto es que podrías. Es más granular y te da más flexibilidad.

Lo malo de las secuencias es que tienes que escribir código para incrementarlas realmente, ya sea en tu instrucción de inserción o en un activador de inserción sobre la mesa. Lo bueno de la identidad de SQL Server es que todo lo que tiene que hacer es cambiar una propiedad o agregar una palabra clave a la creación de su tabla y listo.

+0

Uhh, estas son dos cosas totalmente diferentes. On es el concepto de identidad, que PUEDE ser administrado por una secuencia generada. Y el otro es una secuencia generada. Quejarse de uno no merece malos sentimientos hacia el otro. –

+0

99.El 9% de las veces, una columna de SQL Server IDENTITY y una secuencia de Oracle se usan con el mismo propósito: como una clave generada de base de datos para proporcionar unicidad a una fila. Sin embargo, puede usar una secuencia de Oracle de otras formas que no puede usar una columna de IDENTIDAD. Estaba señalando que otros proveedores de bases de datos reconocen la necesidad de tener la capacidad de generar automáticamente valores para más de un campo en una tabla, y SQL Server no. El autor de la pregunta parecía perplejo y perturbado por esto, y estaba de acuerdo con ese sentimiento. –

+1

-1 Esto no intenta responder la pregunta. –

2

Porque MS se dio cuenta de que más del 80% de los usuarios solo querían una columna de autoincremento por mesa y la solución alternativa para tener una segunda (o más) es lo suficientemente simple, es decir, crear una IDENTIDAD con semilla = 1, incrementar = 1 luego una columna calculada que multiplica el valor generado automáticamente por un factor para cambiar el incremento y agregar un desplazamiento para cambiar la semilla.

1

Sí, las secuencias permiten más de una identidad como columnas en una tabla, pero aquí hay algunos problemas. En un escenario de desarrollo típico, he visto a los desarrolladores insertar manualmente valores válidos en una columna (que se supone que debe insertarse a través de la secuencia). Más adelante, cuando una secuencia intente insertar valor en la tabla, puede fallar debido a una violación de clave única.

Además, en un escenario de desarrollador múltiple/proveedor múltiple, los desarrolladores pueden usar la misma secuencia para más de una tabla (ya que las secuencias no están vinculadas a tablas). Esto podría llevar a valores perdidos en una de las tablas. es decir, la tabla A podría obtener el valor 1, mientras que la tabla B podría usar el valor 2 y la tabla A obtendría 3. Esto significa que la tabla A tendrá 1 y 3 (faltan 2).

Aparte de esto, hay otro escenario en el que tiene una tabla que se trunca todos los días. Dado que las secuencias no tienen ningún vínculo con la tabla, la tabla truncada continuará usando Seq.NextVal nuevamente (a menos que reinicie manualmente la secuencia) lo que generará valores faltantes o incluso un error de desbordamiento arthmético más peligroso después de algún tiempo.

Debido a la razón anterior, creo que tanto las secuencias de Oracle como la columna de identidad del servidor SQL son buenas para sus propósitos. Preferiría que Oracle implementara el concepto de Columna de identidad y SQL Server implementando el concepto de secuencia para que los desarrolladores puedan implementar cualquiera de los dos según sus requisitos.

+0

Esta pregunta se realizó sobre columnas de identidad, no sobre objetos de secuencia (que ahora están disponibles a partir de SQL Server 2012). –

Cuestiones relacionadas