2010-11-27 16 views
51

En un SQL Server db, ¿cuál es la diferencia entre una clave principal y una columna de identidad? Una columna puede ser una clave principal sin ser una identidad. Sin embargo, una columna no puede ser una identidad sin ser una clave principal.¿Cuál es la diferencia entre una clave principal e identidad?

Además de las diferencias, ¿qué ofrece una columna PK e Identity que solo una columna PK no ofrece?

editar: Oops. Como se señala a continuación y ahora lo verifiqué, una columna puede ser una identidad sin ser un PK. Cuando probé esto, mi tipo de columna era una cadena y no pude establecerlo en una identidad. Tiene sentido.

Respuesta

68

Una columna definitivamente puede ser una identidad sin ser un PK.

Una identidad es simplemente una columna de aumento automático.

Una clave principal es la única columna o columnas que definen la fila.

Estos dos se usan a menudo juntos, pero no es necesario que esto sea así.

+1

En realidad, creo que SQL Server requiere que sea así, pero otras bases de datos puede no serlo. –

+7

Estoy 99% seguro de que no es así, pero no tengo acceso a una instancia para confirmar. – Joe

+4

No es así. Esto funciona – KenJ

1

ediciones hechas basado en la retroalimentación

Una clave es única para una fila. Es una forma de identificar una fila. Las filas pueden tener ninguna, una o varias claves. Estas claves pueden consistir en una o más columnas.

Las claves son índices con una restricción única. Esto los diferencia de los índices no clave.

Cualquier índice con columnas múltiples se denomina "índice compuesto".

Tradicionalmente, una clave principal se ve como la clave principal que identifica de manera única una fila. Solo puede haber uno de estos.

Según el diseño de la tabla, es posible que uno no tenga una clave principal.

Una clave principal es solo eso: una "llave principal". Es el principal que especifica la identidad única de una fila. Dependiendo del diseño de una mesa, esto puede ser un nombre inapropiado y las claves múltiples expresan la singularidad.

En SQL Server, una clave principal puede agruparse. Esto significa que las columnas restantes se adjuntan a esta clave en el nivel de hoja del índice. En otras palabras, una vez que el Servidor SQL ha encontrado la clave, también ha encontrado la fila (para ser claro, esto se debe al aspecto agrupado de ).

Una columna de identidad es simplemente un método para generar una identificación única para una fila.

Estos dos a menudo se usan juntos, pero esto no es un requisito.

+0

SQL Server no requiere que la clave principal sea un índice agrupado. –

+0

Es cierto. Yo modificaría lo que dije * generalmente *. – IamIC

+0

@IanC: "La razón por la que se llama Primary es que esta es la clave que identifica de manera única la fila". Esto no es realmente una explicación porque CUALQUIER tecla o cualquier superclave identifica de forma única una fila, no solo la clave "primaria". "Principal" realmente solo significa una tecla "preferida" o "especial", aunque solo es tan especial como usted quiera que sea. – sqlvogel

7

Una clave principal (también conocida como clave candidata) es cualquier conjunto de atributos que tienen las propiedades de unicidad y minimización. Eso significa que la columna o columnas clave están obligadas a ser únicas. En otras palabras, el DBMS no permitirá que dos filas tengan el mismo conjunto de valores para esos atributos.

La propiedad IDENTIDAD crea efectivamente un valor predeterminado de auto incremento para una columna. Sin embargo, esa columna no tiene que ser única, por lo que una columna de IDENTIDAD no es necesariamente una clave.

Sin embargo, una columna de IDENTIDAD está diseñada para ser utilizada como clave y, por lo tanto, generalmente tiene una restricción de exclusividad para garantizar que no se permiten duplicados.

+2

Parece que la palabra "Identidad" en este caso es un poco inapropiado ya que no siempre es única, como usted señaló, [como otros] (https://www.simple-talk.com/sql/t-sql-programming/identity-columns /). Su respuesta ayuda a quienes tienen más experiencia con MySql para comprender mejor la propiedad Identidad del servidor SQL al enfatizar que simplemente crea un valor predeterminado de autoincrementación para una columna, y por lo tanto parece análogo a [propiedad AUTO_INCREMENT de MySql] (http: // www .w3schools.com/sql/sql_autoincrement.asp). Gracias. –

10

Esta respuesta es más de POR QUÉ identidad y clave primay que QUÉ son, ya que Joe ha respondido QUÉ correctamente arriba.

Una identidad es un valor que controla SQL. La identidad es una función de fila. Es secuencial ya sea aumentando o disminuyendo en valor, al menos en SQL Server. Nunca debe modificarse y las brechas en el valor deben ignorarse. Los valores de identidad son muy útiles para vincular la tabla B con la tabla A ya que el valor nunca se duplica. La identidad no es la mejor opción para un índice agrupado en todos los casos. Si una tabla contiene datos de auditoría, es posible que el índice agrupado se cree mejor en la fecha en que ocurrió, ya que presentará la respuesta a la pregunta "qué sucedió entre hoy y cuatro días atrás" con menos trabajo porque los registros de las fechas son secuenciales en el páginas de datos.

Una clave principal hace que la columna o columnas en una fila sean únicas. La clave Primay es una función de columna. Solo se puede definir una clave principal en cualquier tabla, pero se pueden crear múltiples índices únicos que simulan la clave primaria. Agrupar la clave principal no siempre es la elección correcta. Considera una guía telefónica. Si la guía telefónica está agrupada por la clave principal (número de teléfono), la consulta para devolver los números de teléfono en "First Street" será muy costosa.

Las normas generales que sigo para la identidad y la clave primaria son:

  1. Siempre usa una columna de identidad
  2. Crear el índice agrupado en la columna o columnas que se utilizan en las búsquedas de rango
  3. Mantenga el índice agrupado estrecho ya que el índice agrupado se agrega al final de cualquier otro índice
  4. Crear clave principal e índices únicos para rechazar los valores duplicados
  5. Las claves estrechas se apuestan ter
  6. crear un índice para cada columna o columnas utilizadas en las combinaciones

Estos son mis reglas generales.

+1

Menciona que los valores de identidad nunca se duplican. Se pueden duplicar si se insertan o resiembran manualmente (https://subhrosaha.wordpress.com/2012/11/14/sql-server-duplicate-values-in-identity-columns/). Si desea garantizar la restricción de exclusividad, p. índice único debe ser agregado a columna/s. – broadband

0

Clave principal que enfatiza la exclusividad y evita el valor de duplicación para todos los registros en la misma columna, mientras que la identidad proporciona números crecientes en una columna sin insertar datos. Ambas características podrían estar en una sola columna o en una diferencia.

0

Puede usar la identidad no sólo con números enteros, sino también con cualquier tipo de datos numérico que tiene una escala de 0

clave primaria podría tener escala, pero no es necesario.

IDENTIDAD, combinado con una restricción PRIMARY KEY o UNIQUE, le permite proporcionar un simple identificador de fila única

Cuestiones relacionadas