sql >> Base de Datos >  >> RDS >> Sqlserver

Claves primarias en SQL Server

En todos los principales productos RDBMS, Clave principal en restricciones de SQL tiene un papel fundamental. Identifican los registros presentes en una tabla de forma única. Por lo tanto, debemos elegir cuidadosamente el servidor de claves primarias durante el diseño de la tabla para mejorar el rendimiento.

En este artículo, aprenderemos qué es una restricción de clave principal. Además, veremos cómo crear, modificar o eliminar restricciones de claves principales.

Restricciones de SQL Server

En SQL Server, Restricciones son reglas que regulan el ingreso de los datos en las columnas necesarias. Las restricciones imponen la precisión de los datos y cómo esos datos coinciden con los requisitos comerciales. Además, hacen que los datos sean confiables para los usuarios finales. Por eso es fundamental identificar las Restricciones correctas durante la fase de diseño de la base de datos o esquema de tabla.

SQL Server admite los siguientes tipos de restricciones para hacer cumplir la integridad de los datos:

Restricciones de clave principal se crean en una sola columna o combinación de columnas para hacer cumplir la unicidad de los registros e identificar los registros más rápido. Las columnas involucradas no deben contener valores NULL. Por lo tanto, la propiedad NOT NULL debe definirse en las columnas.

Restricciones de clave externa se crean en una sola columna o combinación de columnas para crear una relación entre dos tablas y hacer cumplir los datos presentes en una tabla a otra. Idealmente, las columnas de la tabla en las que necesitamos aplicar los datos con restricciones de clave externa se refieren a la tabla de origen con una restricción de clave principal en SQL o clave única. En otras palabras, solo los registros disponibles en las restricciones de clave principal o única de la tabla de origen se pueden insertar o actualizar en la tabla de destino.

Restricciones de clave única se crean en una sola columna o en una combinación de columnas para imponer la unicidad en los datos de la columna. Son similares a las restricciones de clave principal con un solo cambio. La diferencia entre la clave principal y las restricciones de clave única es que esta última se puede crear en Anulable columnas y permitir un registro de valor NULL en su columna.

Comprobar restricciones se crean en una sola columna o combinación de columnas al restringir los valores de datos aceptados para las columnas involucradas a través de una expresión lógica. Hay una diferencia entre la clave externa y las restricciones de verificación. La clave externa impone la integridad de los datos al verificar los datos de la clave principal o única de otra tabla. Sin embargo, Check Constraint hace esto usando una expresión lógica.

Ahora, repasemos las restricciones de clave principal.

Restricción de clave principal

La restricción de clave principal impone la unicidad en una sola columna o combinación de columnas sin ningún valor NULL dentro de las columnas involucradas.

Para imponer la exclusividad, SQL Server crea un índice agrupado único en las columnas donde se crearon las claves principales. Si hay índices agrupados existentes, SQL Server crea un índice único no agrupado en la tabla para la clave principal.

Veamos cómo creamos, modificamos, soltamos, deshabilitamos o habilitamos claves principales en una tabla usando scripts T-SQL.

Crear una clave principal

Podemos crear claves primarias en una tabla durante la creación de la tabla o después de eso. La sintaxis varía ligeramente para estos escenarios.

Creación de la Clave Primaria Durante la Creación de la Tabla

La sintaxis es la siguiente:

CREATE TABLE SCHEMA_NAME.TABLE_NAME
( 
  COLUMN1 datatype [ NULL | NOT NULL ] PRIMARY KEY,
  COLUMN2 datatype [ NULL | NOT NULL ],
  ...
);

Vamos a crear una tabla llamada Empleados en Recursos Humanos esquema con fines de prueba con el siguiente script:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL PRIMARY KEY,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);

Hemos creado con éxito HumanResources.Employees mesa en AdventureWorks base de datos:

Podemos ver que el índice agrupado se creó en la tabla que coincide con el nombre de la clave principal como se resalta arriba.

Sueltemos la tabla usando el siguiente script e intentemos nuevamente con la nueva sintaxis.

DROP TABLE HumanResources.Employees

Para crear la clave principal en SQL en una tabla con el nombre de clave principal definido por el usuario PK_Employees , utilice la siguiente sintaxis:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (Employee_Id)
);

Hemos creado los HumanResources.Employees tabla con el nombre de la clave principal PK_Employees :

Creación de la Clave Primaria Después de la Creación de la Tabla

A veces, los desarrolladores o administradores de bases de datos se olvidan de las claves principales y crean tablas sin ellas. Pero es posible crear una clave principal en las tablas existentes.

Dejemos los HumanResources.Employees tabla y recréela usando el siguiente script:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

Cuando ejecuta este script con éxito, podemos ver los HumanResources.Employees tabla creada sin claves primarias o índices:

Para crear una clave principal denominada PK_Employees en esta tabla, use la siguiente sintaxis:

ALTER TABLE <schema_name>.<table_name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY ( <column_name> );

La ejecución de este script crea la clave principal en nuestra tabla:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);

Creación de clave principal en varias columnas

En nuestros ejemplos, creamos claves principales en columnas individuales. Si queremos crear claves principales en varias columnas, necesitamos una sintaxis diferente.

Para agregar varias columnas como parte de la clave principal, simplemente debemos agregar valores separados por comas de los nombres de las columnas que deben formar parte de la clave principal.

Clave principal durante la creación de la tabla

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name)
);
GO

Clave principal después de la creación de la tabla

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name);
GO

Soltar la clave principal

Para soltar la clave principal, usamos la siguiente sintaxis. No importa si la clave principal estaba en una o varias columnas.

ALTER TABLE <schema_name>.<table_name>
DROP CONSTRAINT <constraint_name> ;

Para eliminar la restricción de clave principal en HumanResources.Employees tabla, use el siguiente script:

ALTER TABLE HumanResources.Employees
DROP CONSTRAINT PK_Employees;

Al eliminar la clave principal, se eliminan tanto las claves principales como los índices agrupados o no agrupados creados junto con la creación de la clave principal:

Modificar la clave principal

En SQL Server, no hay comandos directos para modificar las claves principales. Necesitamos eliminar una clave principal existente y volver a crearla con las modificaciones necesarias. Por lo tanto, los pasos para modificar la clave principal son:

  1. Soltar una clave principal existente.
  2. Cree nuevas claves principales con los cambios necesarios.

Deshabilitar/Habilitar clave principal

Mientras realiza una carga masiva en una tabla con muchos registros, deshabilite la clave principal y vuelva a habilitarla para un mejor rendimiento. Los pasos son los siguientes:

Deshabilite la clave principal existente con la siguiente sintaxis:

ALTER INDEX <index_name> ON <schema_name>.<table_name> DISABLE;

Para deshabilitar la clave principal en HumanResources.Employees tabla, el script es:

ALTER INDEX PK_Employees ON HumanResources.Employees
DISABLE;

Habilite las claves principales existentes que están en estado deshabilitado. Necesitamos RECONSTRUIR el índice usando la siguiente sintaxis:

ALTER INDEX <index_name> ON <schema_name>.<table_name> REBUILD;

Para habilitar la clave principal en HumanResources.Employees tabla, use el siguiente script:

ALTER INDEX PK_Employees ON HumanResources.Employees
REBUILD;

Los mitos sobre la clave principal

Mucha gente se confunde con los siguientes mitos relacionados con las claves principales en SQL Server.

  • La tabla con clave principal no es una tabla de montón
  • Las claves primarias tienen el índice agrupado y los datos ordenados en orden físico

Vamos a aclararlos.

La tabla con clave primaria no es una tabla de montón

Antes de profundizar más, revisemos la definición de la clave principal y la tabla de almacenamiento dinámico.

La clave principal crea un índice agrupado en una tabla si no hay otros índices agrupados disponibles allí. Una tabla sin un índice agrupado será una tabla de almacenamiento dinámico.

Según estas definiciones, podemos entender que la clave principal crea un índice agrupado solo si no hay otros índices agrupados en la tabla. Si hay índices agrupados existentes, la creación de la clave principal creará un índice no agrupado en la tabla que coincida con la clave principal.

Verifiquemos esto descartando HumanResources.Employees Tabla y recrearla:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (Employee_Id)
);
GO

Podemos especificar la opción de índice NO CLUSTERADO para la clave principal (ver arriba). Se creó una tabla con un índice único no agrupado para la Clave PK_Employees principal. .

Por lo tanto, esta tabla es una tabla de pila aunque tenga una clave principal.

Veamos si SQL Server puede crear un índice no agrupado para la clave principal si no especificamos la palabra clave No agrupado durante la creación de la clave principal. Utilice el siguiente script:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

-- Create Clustered Index on Employee_Id column before creating Primary Key
CREATE CLUSTERED INDEX IX_Employee_ID ON HumanResources.Employees(First_Name, Last_Name);
GO

-- Create Primary Key on Employee_Id column
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO

Aquí hemos creado un índice agrupado por separado antes de la creación de la clave principal. Y una tabla solo puede tener un índice agrupado. Por lo tanto, SQL Server ha creado la clave principal como un índice único no agrupado. En este momento, la tabla no es una tabla Heap porque tiene un índice agrupado.

Si cambié de opinión y eliminé el índice agrupado en First_Name y Apellido columnas usando el siguiente script:

DROP INDEX IX_Employee_ID ON HumanResources.Employees;
GO

Hemos descartado el índice agrupado con éxito. Los RecursosHumanos.Empleados la tabla es una tabla Heap aunque tenemos una clave principal disponible en la tabla:

Esto aclara el mito de que una tabla con una clave principal puede ser una tabla Heap si no hay índices agrupados disponibles en la tabla.

La clave principal tendrá un índice agrupado y datos ordenados en orden físico

Como aprendimos del ejemplo anterior, una clave principal en SQL puede tener un índice no agrupado. En ese caso, los registros no se clasificarían en orden físico.

Verifiquemos la tabla con el índice agrupado en una clave principal. Vamos a comprobar si ordena los registros en orden físico.

Vuelva a crear los HumanResources.Employees tabla con columnas mínimas y la propiedad IDENTITY eliminada para Employee_ID columna:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL
);
GO

Ahora que hemos creado la tabla sin la clave principal o un índice agrupado, podemos INSERTAR 3 registros en un orden no ordenado para el Employee_Id columna:

INSERT INTO HumanResources.Employees ( Employee_Id, First_Name, Last_Name)
VALUES
(3, 'Antony', 'Mark'),
(1, 'James', 'Cameroon'),
(2, 'Jackie', 'Chan')

Seleccionemos de HumanResources.Employees tabla:

SELECT * 
FROM HumanResources.Employees

Podemos ver los registros obtenidos en el mismo orden que los registros insertados desde la tabla Heap en este momento.

Vamos a crear una clave principal en esta tabla Heap y ver si tiene algún impacto en la instrucción SELECT:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO
SELECT * 
FROM HumanResources.Employees

Después de la creación de la clave principal, podemos ver que la declaración SELECT obtuvo registros en orden ascendente de Employee_Id (columna Clave principal). Se debe al índice agrupado en Employee_Id .

Si se crea una clave principal con la opción no agrupada, los datos de la tabla no se ordenarán según la columna de la clave principal.

Si la longitud de un solo registro en una tabla supera los 4030 bytes, solo un registro puede caber en una página. El índice agrupado garantiza que las páginas estén en orden físico.

Una página es una unidad fundamental de almacenamiento en archivos de datos de SQL Server con un tamaño de 8 KB (8192 bytes). Solo 8060 bytes de esa unidad se pueden usar para el almacenamiento de datos. La cantidad restante es para encabezados de página y otros elementos internos.

Consejos para elegir columnas de clave principal

  • Las columnas de tipo de datos enteros son más adecuadas para las columnas de clave principal, ya que ocupan tamaños de almacenamiento más pequeños y pueden ayudar a recuperar los datos más rápido.
  • Dado que las columnas de clave principal tienen un índice agrupado de forma predeterminada, use la opción IDENTIDAD en las columnas de tipo de datos enteros para generar nuevos valores en orden incremental.
  • En lugar de crear una clave principal en varias columnas, cree una nueva columna de enteros con la propiedad IDENTIDAD definida. Además, cree un índice único en varias columnas que se identificaron originalmente para un mejor rendimiento.
  • Intente evitar columnas con tipos de datos de cadena como varchar, nvarchar, etc. No podemos garantizar el incremento secuencial de datos en estos tipos de datos. Puede afectar el rendimiento de INSERT en estas columnas.
  • Elija columnas en las que los valores no se actualicen como claves principales. Por ejemplo, si el valor de la clave principal puede cambiar de 5 a 1000, el árbol B asociado con el índice agrupado debe actualizarse, lo que provocará una ligera degradación del rendimiento.
  • Si las columnas de tipo de datos de cadena deben elegirse como columnas de clave principal, asegúrese de que la longitud de las columnas de tipo de datos varchar o nvarchar siga siendo pequeña para un mejor rendimiento.

Conclusión

Hemos repasado los conceptos básicos de las restricciones disponibles en SQL Server. Examinamos las restricciones de la clave principal en detalle y aprendimos cómo crear, soltar, modificar, deshabilitar y reconstruir claves principales. Además, hemos aclarado algunos mitos populares sobre las claves primarias con ejemplos.

¡Estén atentos para el próximo artículo!