SQL
6 minutos Publicado el 25/01/2026Restricciones de Clave Primaria y Propiedad IDENTITY en SQL
Clave primaria (PRIMARY KEY)
Una restricción PRIMARY KEY identifica de manera unívoca cada fila dentro de una tabla en una base de datos relacional. Garantiza que los atributos designados no contengan valores duplicados ni admitan valores nulos (NULL), creando internamente un índice único para optimizar las consultas.
Sintaxis
A nivel de columna (en línea):
CREATE TABLE nombre_tabla (
columna tipo_dato [NOT NULL] PRIMARY KEY,
...
);
A nivel de tabla (restricción explícita):
CREATE TABLE nombre_tabla (
columna1 tipo_dato NOT NULL,
columna2 tipo_dato NOT NULL,
...,
[CONSTRAINT nombre_restriccion] PRIMARY KEY (columna1 [, columna2])
);
Desglose de elementos
PRIMARY KEY: Especificación de la restricción. Puede declararse inmediatamente después del tipo de dato (nivel columna) o al final de la definición de campos (nivel tabla).CONSTRAINT nombre_restriccion: Asigna un identificador personalizado a la regla en el catálogo del motor. Si se omite, el motor genera un nombre interno por defecto (por ejemplo,PK__nombre_t__3213E83F...).(columna1, columna2): Lista de uno o más atributos que conforman la clave. Cuando abarca dos o más columnas, se denomina clave primaria compuesta y debe declararse obligatoriamente a nivel de tabla.
Ejemplo práctico
Creación de una tabla con clave primaria compuesta explícitamente nombrada:
CREATE TABLE asignaciones (
oficina INT NOT NULL,
edificio INT NOT NULL,
descripcion VARCHAR(50),
CONSTRAINT PK_asignaciones PRIMARY KEY (oficina, edificio)
);
Si intentás insertar registros duplicados en los campos que componen la clave:
INSERT INTO asignaciones (oficina, edificio, descripcion) VALUES (101, 1, 'Administración');
INSERT INTO asignaciones (oficina, edificio, descripcion) VALUES (101, 1, 'Contabilidad');
# Salida / Output
Msg 2627, Level 14, State 1, Line 2
Violation of PRIMARY KEY constraint 'PK_asignaciones'. Cannot insert duplicate key in object 'dbo.asignaciones'. The duplicate key value is (101, 1).
Tablas de referencia o atajos
| Comando / Opción | Descripción |
|---|---|
PRIMARY KEY (en columna) |
Define la clave directamente sobre un único atributo sin asignarle un nombre explícito. |
CONSTRAINT <nombre> PRIMARY KEY (<col>) |
Define la clave a nivel de tabla asignando un nombre personalizado para facilitar auditorías y modificaciones. |
PRIMARY KEY (<col1>, <col2>) |
Define una clave primaria compuesta estructurada por dos o más atributos. |
Notas de atención y tips
💡 Tip: Nombrá siempre tus restricciones mediante la cláusula
CONSTRAINT. Esto simplifica la gestión del esquema al momento de realizar modificaciones (ALTER TABLE ... DROP CONSTRAINT) o interpretar errores en logs de ejecución.
⚠️ Atención: Las columnas participantes de una clave primaria no pueden aceptar valores nulos (
NULL). Aunque algunos motores aplicanNOT NULLde forma implícita al declarar la clave, definí siempreNOT NULLde forma explícita para asegurar la portabilidad del código DDL.
Propiedad IDENTITY
La propiedad IDENTITY genera automáticamente valores numéricos secuenciales correlativos para una columna cada vez que se inserta una nueva fila. Se utiliza principalmente en motores como SQL Server para implementar identificadores sustitutos (surrogate keys) sin intervención manual del usuario.
Sintaxis
CREATE TABLE nombre_tabla (
columna tipo_dato IDENTITY[(semilla, incremento)] [PRIMARY KEY],
...
);
Desglose de elementos
semilla(seed): Valor numérico inicial asignado a la primera fila registrada en la tabla. El valor predeterminado es1.incremento(increment): Intervalo numérico que se suma al valor del registro previo para obtener el siguiente ID. El valor predeterminado es1.
Ejemplo práctico
Creación de una tabla con clave primaria autoincremental combinando IDENTITY y una restricción con nombre:
CREATE TABLE oficinas (
id INT IDENTITY(1,1) NOT NULL,
codigo_postal VARCHAR(10) NOT NULL,
CONSTRAINT PK_oficinas PRIMARY KEY (id)
);
INSERT INTO oficinas (codigo_postal) VALUES ('B1617');
INSERT INTO oficinas (codigo_postal) VALUES ('B1618');
SELECT id, codigo_postal FROM oficinas;
# Salida / Output
id codigo_postal
----------- -------------
1 B1617
2 B1618
Tablas de referencia o atajos
| Comando / Opción | Descripción |
|---|---|
IDENTITY(1,1) |
Inicializa la secuencia en 1 y la incrementa en pasos de 1. |
IDENTITY(100,10) |
Inicializa la secuencia en 100 y avanza de diez en diez (100, 110, 120…). |
SET IDENTITY_INSERT <tabla> ON |
Permite insertar manualmente valores explícitos en la columna IDENTITY para tareas de migración o respaldo. |
Notas de atención y tips
💡 Tip: No incluyas la columna
IDENTITYen la lista de campos de una sentenciaINSERT; el motor asigna el valor secuencial automáticamente de forma concurrente y atómica.
⚠️ Atención: Solo se permite una única columna
IDENTITYpor tabla. Si una sentenciaINSERTfalla o se ejecuta unROLLBACKdurante una transacción, el número generado no se recicla, lo que produce saltos (huecos) en la correlatividad de los identificadores. Los valores de una columnaIDENTITYno se pueden modificar mediante sentenciasUPDATE.