Hasta ahora hemos estudiado varias restricciones importantes:
NOT NULL
DEFAULT
UNIQUE
Todas ellas ayudan a mejorar la calidad de los datos, pero a煤n queda una pregunta fundamental:
¿C贸mo identificamos de manera 煤nica cada registro dentro de una tabla?
Para resolver este problema PostgreSQL utiliza la restricci贸n PRIMARY KEY.
馃 ¿Qu茅 es una PRIMARY KEY?
Una Primary Key (Clave Primaria) es una columna, o conjunto de columnas, que identifica de forma 煤nica cada fila de una tabla.
En otras palabras:
✅ Cada valor debe ser 煤nico.
✅ No puede ser NULL.
✅ Permite identificar exactamente un registro.
Por ejemplo, en una tabla de empleados:
La columna id puede utilizarse como clave primaria porque cada valor es 煤nico y permite localizar un registro espec铆fico.
馃幆 ¿Por qu茅 es importante?
Las claves primarias son fundamentales porque:
Identifican registros de forma 煤nica.
Evitan duplicados.
Facilitan las b煤squedas.
Sirven como base para las relaciones entre tablas.
Ayudan a mantener la integridad de los datos.
Pr谩cticamente toda tabla deber铆a tener una clave primaria.
馃攳 PRIMARY KEY = UNIQUE + NOT NULL
Conceptualmente, una clave primaria combina dos reglas:
PRIMARY KEY
=
UNIQUE
+
NOT NULL
Por lo tanto:
✅ Los valores no pueden repetirse.
✅ Los valores no pueden ser nulos.
馃彈️ Definir una PRIMARY KEY sobre una columna
La forma m谩s sencilla es definirla junto con la columna.
CREATE TABLE empleados (
id INTEGER PRIMARY KEY,
nombre VARCHAR(100),
departamento VARCHAR(100)
);
En este caso:
id es la clave primaria.
Cada empleado debe tener un ID 煤nico.
✅ Insertar registros v谩lidos
INSERT INTO empleados (
id,
nombre,
departamento
)
VALUES
(
1,
'Juan P茅rez',
'Tecnolog铆a'
),
(
2,
'Ana L贸pez',
'Finanzas'
);
Consultar:
SELECT *
FROM empleados;
Resultado:
id | nombre | departamento
----+-------------+-------------
1 | Juan P茅rez | Tecnolog铆a
2 | Ana L贸pez | Finanzas
❌ Intentar insertar una PRIMARY KEY duplicada
Ahora intentemos insertar un registro con un ID ya existente.
INSERT INTO empleados (
id,
nombre,
departamento
)
VALUES (
1,
'Carlos Garc铆a',
'Ventas'
);
PostgreSQL devolver谩 un error similar a:
ERROR: duplicate key value violates unique constraint
Esto ocurre porque ya existe un registro con:
id = 1
❌ Intentar insertar NULL
Tampoco se permiten valores nulos.
INSERT INTO empleados (
id,
nombre
)
VALUES (
NULL,
'Roberto Mart铆nez'
);
Resultado:
ERROR: null value in column "id"
violates not-null constraint
馃彈️ PRIMARY KEY a Nivel de Tabla
Tambi茅n es posible declarar la clave primaria al final de la definici贸n de la tabla.
Sin nombre expl铆cito
CREATE TABLE empleados (
id INTEGER,
nombre VARCHAR(100),
departamento VARCHAR(100),
PRIMARY KEY (id)
);
Con nombre expl铆cito (recomendado)
Al igual que vimos con UNIQUE, podemos asignar un nombre a la restricci贸n.
CREATE TABLE empleados (
id INTEGER,
nombre VARCHAR(100),
departamento VARCHAR(100),
CONSTRAINT pk_empleados
PRIMARY KEY (id)
);
Beneficios:
Mayor claridad.
Administraci贸n m谩s sencilla.
Mensajes de error m谩s entendibles.
Facilita futuras modificaciones.
馃搵 Convenci贸n de nombres recomendada
Es com煤n utilizar el prefijo:
pk_
seguido del nombre de la tabla.
Ejemplos:
pk_usuarios
pk_productos
pk_clientes
pk_empleados
pk_facturas
馃И Ejemplo Completo
Crear tabla
CREATE TABLE productos (
codigo INTEGER,
nombre VARCHAR(100),
precio NUMERIC(10,2),
CONSTRAINT pk_productos
PRIMARY KEY (codigo)
);
Insertar datos v谩lidos
INSERT INTO productos (
codigo,
nombre,
precio
)
VALUES
(
1001,
'Laptop',
18000.00
),
(
1002,
'Monitor',
4500.00
);
Consultar:
SELECT *
FROM productos;
Resultado:
codigo | nombre | precio
--------+----------+----------
1001 | Laptop | 18000.00
1002 | Monitor | 4500.00
Intentar insertar un c贸digo duplicado
INSERT INTO productos (
codigo,
nombre,
precio
)
VALUES (
1001,
'Teclado',
750.00
);
Resultado:
ERROR: duplicate key value violates unique constraint "pk_productos"
馃攽 Claves Primarias Compuestas
Una Primary Key tambi茅n puede estar formada por varias columnas.
Esto se conoce como clave primaria compuesta.
Ejemplo
Supongamos una tabla de inscripciones.
CREATE TABLE inscripciones (
alumno_id INTEGER,
curso_id INTEGER,
fecha_inscripcion DATE,
CONSTRAINT pk_inscripciones
PRIMARY KEY (
alumno_id,
curso_id
)
);
En este caso:
Un alumno puede estar en muchos cursos.
Un curso puede tener muchos alumnos.
La combinaci贸n alumno-curso debe ser 煤nica.
Registros v谩lidos
INSERT INTO inscripciones
VALUES
(
1,
10,
'2026-07-01'
),
(
1,
20,
'2026-07-02'
);
Registro inv谩lido
INSERT INTO inscripciones
VALUES
(
1,
10,
'2026-07-03'
);
Resultado:
ERROR: duplicate key value violates unique constraint
Porque la combinaci贸n:
(1,10)
ya existe.
馃敡 Agregar una PRIMARY KEY a una tabla existente
Si la tabla ya fue creada:
ALTER TABLE empleados
ADD CONSTRAINT pk_empleados
PRIMARY KEY (id);
馃敡 Eliminar una PRIMARY KEY
ALTER TABLE empleados
DROP CONSTRAINT pk_empleados;
⚠️ ¿Cu谩ntas PRIMARY KEY puede tener una tabla?
Una tabla puede tener:
✅ Una 煤nica Primary Key.
❌ No puede tener dos Primary Keys.
Por ejemplo:
CREATE TABLE ejemplo (
id INTEGER PRIMARY KEY,
codigo INTEGER PRIMARY KEY
);
Esto generar谩 un error.
Si necesitas controlar la unicidad de otras columnas, utiliza UNIQUE.
馃挕 Buenas pr谩cticas
Toda tabla deber铆a tener una Primary Key
✅ Recomendado
CREATE TABLE clientes (
id INTEGER PRIMARY KEY,
nombre VARCHAR(100)
);
Utiliza nombres descriptivos
cliente_id
producto_id
empleado_id
factura_id
suelen ser m谩s claros que:
id1
id2
codigo
Asigna nombres a las restricciones
CONSTRAINT pk_clientes
PRIMARY KEY (cliente_id)
Esto simplifica el mantenimiento del esquema.
Mant茅n la Primary Key estable
Evita utilizar columnas cuyos valores puedan cambiar con frecuencia.
Por ejemplo:
❌
telefono
username
✅
cliente_id
empleado_id
producto_id
✅ Conclusi贸n
La restricci贸n PRIMARY KEY es uno de los conceptos m谩s importantes de PostgreSQL y de las bases de datos relacionales en general.
Los puntos clave son:
Identifica de forma 煤nica cada registro.
No permite valores duplicados.
No permite valores nulos.
Cada tabla puede tener una sola Primary Key.
Puede estar formada por una o varias columnas.
Es recomendable asignar nombres expl铆citos a la restricci贸n utilizando la palabra clave CONSTRAINT.
Constituye la base para crear relaciones entre tablas.
No hay comentarios:
Publicar un comentario