Crear claves principales
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL Database Azure SQL Managed Instance
Puede definir una clave principal en el Motor de base de datos de SQL Server mediante SQL Server Management Studio o Transact-SQL. Al crear una clave principal, se crea automáticamente un índice clúster único correspondiente. Sin embargo, la clave principal se puede especificar como un índice no clúster en su lugar.
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
Limitaciones
Una tabla solo puede incluir una restricción PRIMARY KEY
.
Todas las columnas definidas en una restricción PRIMARY KEY
se deben definir como NOT NULL
. Si no se especifica nulabilidad, la nulabilidad de todas las columnas que participan en una restricción PRIMARY KEY
se establece en NOT NULL
.
Permisos
La creación de una tabla nueva con una clave principal requiere el permiso CREATE TABLE
en la base de datos y el permiso ALTER
en el esquema en el que se crea la tabla.
La creación de una clave principal de una tabla existente requiere el permiso ALTER
en la tabla.
Uso de SQL Server Management Studio
- En el Explorador de objetos, haga clic con el botón derecho en la tabla a la que quiera agregar una restricción única y seleccione Diseño.
- En el Diseñador de tablas, haga clic en el selector de filas de la columna de base de datos que desea definir como clave principal. Si desea seleccionar varias columnas, mantenga presionada la tecla CTRL mientras selecciona los selectores de fila de las otras columnas.
- Haga clic con el botón derecho en el selector de fila para la columna y seleccione Establecer clave principal.
Precaución
Si desea volver a definir la clave principal, debe eliminar las relaciones establecidas con la clave principal existente antes de crear una nueva. Un mensaje le advertirá de que las relaciones existentes se eliminarán automáticamente durante este proceso.
Las columnas de clave principal se indican mediante un símbolo de clave principal en el selector de fila.
Si una clave principal consta de más de una columna, se admitirán valores duplicados en una columna, pero cada combinación de valores de todas las columnas de la clave principal debe ser única.
Si define una clave compuesta, el orden de las columnas de la clave principal coincide con el de las columnas mostradas en la tabla. Sin embargo, puede cambiar el orden de las columnas después de crear la clave principal. Para obtener más información, vea Modificar claves principales.
Uso de Transact-SQL
Creación de una clave principal en una tabla existente
En el ejemplo siguiente se crea una clave principal en la columna TransactionID
de la base de datos AdventureWorks2022
.
ALTER TABLE [Production].[TransactionHistoryArchive]
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID);
Creación de una clave principal en una tabla nueva
En el ejemplo siguiente se crea una tabla y se define una clave principal en la columna TransactionID
de la base de datos AdventureWorks2022
.
CREATE TABLE [Production].[TransactionHistoryArchive1] (
TransactionID INT IDENTITY(1, 1) NOT NULL,
CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
);
Creación de una clave principal no agrupada con un índice agrupado separado en una tabla nueva
En el ejemplo siguiente se crea una tabla en la base de datos AdventureWorks2022
con una clave principal no agrupada en la columna CustomerID
. A continuación, agrega un índice agrupado en TransactionID
.
Cree una tabla para agregar el índice agrupado.
CREATE TABLE [Production].[TransactionHistoryArchive1] ( CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), TransactionID INT IDENTITY(1, 1) NOT NULL, CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) );
Ahora agregue el índice agrupado.
CREATE CLUSTERED INDEX CIX_TransactionID ON [Production].[TransactionHistoryArchive1] (TransactionID);