sql >> Base de Datos >  >> RDS >> Database

La diferencia entre la clave principal y la clave única

"¿Cuál es la diferencia entre una restricción de clave principal y una restricción de clave única?"

Esta es probablemente la pregunta de entrevista de trabajo más frecuente para los desarrolladores de bases de datos. En este artículo intentaremos responderla.

Empecemos por ver qué son las claves primarias y únicas, así como sus similitudes.

Clave principal

Se utiliza una clave principal para identificar de forma única cada registro de la tabla. Cada tabla debe tener al menos una clave principal. Para definir una clave principal en el servidor SQL, simplemente necesita usar las palabras clave 'Clave principal' después del nombre de la columna.

Clave única

Una columna con una restricción de clave única solo puede contener valores únicos:este es el resultado de la clave única que prohíbe que se almacenen valores duplicados dentro de una columna.

Para definir una clave única, debe agregar 'Único' al nombre del campo. Tenga en cuenta que no es obligatorio tener una clave única en una tabla.

Ejemplo de creación de claves principales y únicas

El siguiente script crea una base de datos de 'Prueba' que contiene una tabla llamada 'Autos'.

Esta tabla tendrá una columna de clave principal denominada 'ID' y una columna de clave única denominada 'NumberPlate'.

CREATE DATABASE TEST
GO
USE TEST
GO


CREATE TABLE Cars (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int
);

A continuación, agreguemos algunos registros ficticios a nuestra tabla "Autos". Ejecute el siguiente script:

INSERT INTO Cars
VALUES 
(1, 'Toyota', 'ABC 123', 199),
(2, 'Toyota', 'ABC 345', 207),
(3, 'Toyota', 'ABC 758', 205),
(4, 'Toyota', 'ABC 741', 306),
(5, 'Toyota', 'ABC 356', 124)

Antes de hablar sobre las diferencias, primero veamos las similitudes entre las claves primarias y únicas.

Similitudes entre claves primarias y únicas

  1. Las columnas con claves primarias o únicas no pueden tener valores duplicados.

Intentemos agregar un nuevo registro con un valor de ID de 2 (que ya existe) a la tabla 'Autos'. Ejecute el siguiente script:

INSERT INTO Cars
VALUES 
(2, 'Toyota', 'ABC 345', 356)

Cuando ejecute el script anterior, se mostrará el siguiente error:

El error dice claramente que esta declaración viola la restricción de clave principal y que los valores duplicados no se pueden insertar en la columna de clave principal.

De manera similar, intentemos insertar un valor duplicado en la columna 'NumberPlate' con una restricción de clave única usando la siguiente consulta:

INSERT INTO Cars
VALUES 
(6, 'Toyota', 'ABC 345', 356)

Esta vez, verá que hay una violación de la restricción de clave única ya que el valor 'ABC 345' ya existe en la columna 'NumberPlate' que tiene una restricción de clave única. El mensaje de error se verá así:

  1. Dado que tanto la clave principal como las columnas únicas no aceptan valores duplicados, se pueden usar para identificar de forma única un registro en la tabla. Esto significa que, para cada valor en la columna de clave principal o única, solo se devolverá un registro.

Diferencias entre claves primarias y únicas

Ahora que entendemos las similitudes entre las claves primarias y únicas, echemos un vistazo a sus diferencias.

  1. Una tabla solo puede tener una clave principal, pero varias claves únicas.

El siguiente ejemplo nos ayudará a entender esto mejor.

Dentro de la base de datos 'Prueba' que hicimos anteriormente, creemos una nueva tabla 'Cars2' con dos claves principales. Para hacer esto, ejecute el siguiente script:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int PRIMARY KEY
);

En el script anterior, establecemos restricciones de clave principal en las columnas ID y Modelo. Sin embargo, dado que solo una columna de una tabla puede tener una restricción de clave principal, verá el siguiente error:

Este mensaje de error nos informa claramente que una tabla no puede tener varias restricciones de clave principal.

Ahora, agreguemos múltiples restricciones clave únicas a la tabla 'Cars2'. Echa un vistazo a la siguiente secuencia de comandos:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int UNIQUE
);

Esto nos permite agregar restricciones clave únicas en las columnas 'Número de placa' y 'Modelo'. Dado que una tabla puede tener varias columnas con restricciones de clave únicas, no verá ningún mensaje de error al ejecutar el script anterior.

  1. La columna de clave principal no puede tener valores nulos, mientras que la columna de clave única puede tener un valor nulo.

Veamos esto en acción. Primero, agreguemos un registro con un valor nulo a una columna de clave principal en la tabla "Autos". Mira el siguiente guión:

INSERT INTO Cars
VALUES 
( null, 'Toyota', 'ABC 345', 356)

Puede ver que este script inserta un valor nulo en la columna ID. Cuando lo ejecute, debería ver el siguiente error en la ventana del mensaje de salida:

El error nos dice que no se puede insertar un valor nulo ya que la columna de la clave principal no permite valores nulos.

Ahora intentemos agregar valores nulos a la columna de clave única 'NumberPlate'. Para hacer esto, ejecute el siguiente script:

INSERT INTO Cars
VALUES 
( 6, 'Toyota',null, 356)

Esto agrega un nuevo registro con un valor de ID de 6 y un valor nulo a la tabla 'Cars'; específicamente, el valor nulo se asigna a la columna 'NumberPlate'. Verá que la secuencia de comandos anterior se ejecutará sin errores, ya que la columna de clave única puede aceptar valores nulos de forma predeterminada.

Para verificar si el valor nulo se ha insertado realmente en la columna 'Placa de matrícula', necesitaremos seleccionar todos los registros de la tabla 'Autos' utilizando el siguiente script:

SELECT * FROM Cars


En el conjunto de resultados anterior, podemos ver claramente que la columna de clave principal 'ID' no no contiene ningún valor nulo. Por otro lado, la columna 'NumberPlate' con una restricción de clave única contiene un valor nulo que acabamos de insertar. Recuerde, no puede agregar más de un valor nulo a una columna de clave única, ya que el segundo valor nulo será el duplicado del primero, y no se permiten duplicados.

  1. De forma predeterminada, se crea un índice agrupado único en la columna de clave principal; por otro lado, se crea un índice único no agrupado en la columna de clave única.

Para ver los índices en la tabla 'Cars', ejecute el siguiente script:

USE TEST
GO
sp_help Cars

En el resultado, verá los detalles de la tabla "Automóviles", incluidos los índices, como se muestra en la siguiente figura:

En la figura anterior, puede ver que la columna 'NumberPlate' tiene un índice único no agrupado, mientras que la columna ID tiene un índice único agrupado.

Conclusión

A pesar de algunas similitudes básicas, las claves primarias y únicas tienen diferencias significativas. Solo puede tener una clave principal por tabla, pero varias claves únicas. De manera similar, una columna de clave principal no acepta valores nulos, mientras que las columnas de clave única pueden contener un valor nulo cada una. Y finalmente, la columna de clave principal tiene un índice agrupado único, mientras que una columna de clave única tiene un índice no agrupado único.