viernes, 31 de julio de 2026

🐘 La Restricción PRIMARY KEY en PostgreSQL

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:

id

nombre

1

Juan Pérez

2

Ana López

3

Carlos García

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:

email

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.

miércoles, 29 de julio de 2026

Capítulo 1. Introducción

Bienvenida al curso

Bienvenido al curso Desarrollo de Aplicaciones Web con Angular 19 y ASP.NET Core 9. A lo largo de este curso aprenderás a combinar estas dos tecnologías para construir aplicaciones web modernas, escalables y listas para entornos de producción.

Angular es uno de los frameworks más utilizados para el desarrollo de interfaces de usuario dinámicas, mientras que ASP.NET Core proporciona una plataforma robusta y de alto rendimiento para la creación de servicios web y APIs. La integración de ambas tecnologías permite desarrollar soluciones completas bajo una arquitectura moderna cliente-servidor.

Objetivos del curso

Durante el desarrollo del curso se abordarán los fundamentos de Angular y ASP.NET Core mediante un enfoque práctico, construyendo una aplicación desde cero.

Al finalizar el curso, serás capaz de:

  • Comprender los conceptos fundamentales de Angular y ASP.NET Core.

  • Desarrollar aplicaciones web utilizando una arquitectura basada en frontend y backend desacoplados.

  • Consumir APIs REST desde aplicaciones Angular.

  • Implementar operaciones de creación, consulta, actualización y eliminación de datos (CRUD).

  • Aplicar buenas prácticas de desarrollo y organización de proyectos.

  • Publicar una aplicación completa en un entorno de producción.

Metodología

El aprendizaje se realizará de forma progresiva mediante la construcción de un proyecto real. Cada módulo incorporará nuevos conceptos y funcionalidades que permitirán comprender cómo interactúan Angular y ASP.NET Core dentro de una aplicación moderna.

Además de los aspectos teóricos, se desarrollarán ejercicios prácticos que permitirán consolidar los conocimientos adquiridos en cada etapa.

Acerca del instructor

El curso es impartido por Felipe Gavilán, desarrollador y consultor de software especializado en tecnologías Microsoft y desarrollo web moderno.

Próximos pasos

En los siguientes módulos se realizará una introducción más detallada a Angular y ASP.NET Core, revisando sus principales características, ventajas y el papel que desempeña cada tecnología dentro de la arquitectura de la aplicación que construiremos durante el curso.


viernes, 17 de julio de 2026

🐘 La Restricción UNIQUE en PostgreSQL

Hasta ahora hemos visto las restricciones:

  • NULL

  • NOT NULL

  • DEFAULT

Estas nos permiten controlar si una columna puede estar vacía o si debe recibir un valor predeterminado.

Sin embargo, existe otro problema común:

¿Cómo evitar que un mismo valor se almacene varias veces?

Por ejemplo:

  • Dos usuarios con el mismo correo electrónico.

  • Dos empleados con el mismo número de empleado.

  • Dos productos con el mismo código.

Para resolver este problema PostgreSQL proporciona la restricción UNIQUE.


🧠 ¿Qué es UNIQUE?

La restricción UNIQUE garantiza que los valores almacenados en una columna no se repitan.

En otras palabras:

✅ Valores diferentes son permitidos.

❌ Valores duplicados generan error.


🏗️ Sintaxis Básica

La forma más simple de definirla es durante la creación de una tabla.

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200) UNIQUE

);

En este ejemplo:

  • Dos usuarios pueden tener distintos correos.

  • No pueden existir dos usuarios con el mismo correo.


✅ Insertar Valores Únicos

Creamos la tabla:

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200) UNIQUE

);

Insertamos el primer usuario:

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

1,

'Juan Pérez',

'juan@email.com'

);

Insertamos un segundo usuario:

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

2,

'Ana López',

'ana@email.com'

);

Ambos registros se insertan correctamente porque los correos son diferentes.


❌ Intentar Insertar un Duplicado

Ahora intentemos insertar un correo que ya existe.

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

3,

'Carlos García',

'juan@email.com'

);

PostgreSQL devolverá un error similar a:

ERROR: duplicate key value violates unique constraint

La inserción falla porque el valor:

juan@email.com

ya se encuentra almacenado.


🔍 Verificando los Datos

Podemos consultar la tabla:

SELECT *

FROM usuarios;

Resultado:

id | nombre | email

----+-------------+----------------

1 | Juan Pérez | juan@email.com

2 | Ana López | ana@email.com

Observa que el tercer registro nunca fue insertado.


📝 UNIQUE en Otras Columnas

La restricción no está limitada a correos electrónicos.

También suele utilizarse en:

  • RFC

  • CURP

  • Número de empleado

  • Código de producto

  • Nombre de usuario

  • Número de serie

Ejemplo:

CREATE TABLE productos (

codigo VARCHAR(50) UNIQUE,

nombre VARCHAR(100),

precio NUMERIC(10,2)

);


🧪 Ejemplo Completo

Crear Tabla

CREATE TABLE empleados (

numero_empleado INTEGER UNIQUE,

nombre VARCHAR(100),

departamento VARCHAR(100)

);


Insertar Datos

INSERT INTO empleados (

numero_empleado,

nombre,

departamento

)

VALUES

(

1001,

'Juan Pérez',

'Tecnología'

),

(

1002,

'Ana López',

'Finanzas'

);


Consultar

SELECT *

FROM empleados;

Resultado:

numero_empleado | nombre | departamento

----------------+-------------+--------------

1001 | Juan Pérez | Tecnología

1002 | Ana López | Finanzas


Intentar duplicar el número de empleado

INSERT INTO empleados (

numero_empleado,

nombre,

departamento

)

VALUES (

1001,

'Carlos García',

'Ventas'

);

Resultado:

ERROR: duplicate key value violates unique constraint


⚠️ UNIQUE y Valores NULL

Este es uno de los comportamientos que más confunde a quienes comienzan con PostgreSQL.

Supongamos la siguiente tabla:

CREATE TABLE clientes (

id INTEGER,

email VARCHAR(200) UNIQUE

);

Ahora insertamos:

INSERT INTO clientes (id, email)

VALUES (1, NULL);

y posteriormente:

INSERT INTO clientes (id, email)

VALUES (2, NULL);

Ambas inserciones son válidas.


¿Por qué ocurre esto?

Porque PostgreSQL considera que:

NULL != NULL

Un valor nulo significa "valor desconocido", por lo que múltiples registros pueden contener NULL en una columna UNIQUE.

Por esta razón es común combinar:

UNIQUE

con

NOT NULL


🔒 UNIQUE + NOT NULL

Esta es probablemente la combinación más utilizada.

CREATE TABLE usuarios (

id INTEGER,

email VARCHAR(200) NOT NULL UNIQUE

);

Con esta definición:

✅ El correo es obligatorio.

✅ No puede repetirse.

❌ No puede ser NULL.


🏗️ UNIQUE a Nivel de Tabla

Hasta ahora hemos definido UNIQUE directamente sobre una columna.

También puede definirse al final de la tabla.

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200),

UNIQUE(email)

);

El comportamiento es exactamente el mismo.


🔧 Agregar UNIQUE a una Tabla Existente

Si la tabla ya existe:

ALTER TABLE usuarios

ADD CONSTRAINT uq_usuarios_email

UNIQUE(email);

A partir de ese momento PostgreSQL impedirá valores duplicados.


🔧 Eliminar una Restricción UNIQUE

Primero identificamos el nombre de la restricción.

Posteriormente:

ALTER TABLE usuarios

DROP CONSTRAINT uq_usuarios_email;


🎯 UNIQUE en Múltiples Columnas

También podemos exigir que una combinación de columnas sea única.

Supongamos una tabla de cursos.

CREATE TABLE inscripciones (

alumno VARCHAR(100),

curso VARCHAR(100),

CONSTRAINT uq_inscripciones_alumno_curso

UNIQUE(alumno, curso)

);

Esto significa:

✅ Juan puede inscribirse a SQL.

✅ Juan puede inscribirse a PostgreSQL.

✅ Ana puede inscribirse a SQL.

❌ Juan no puede inscribirse dos veces al mismo curso.


Ejemplo

INSERT INTO inscripciones

VALUES ('Juan', 'PostgreSQL');

Luego:

INSERT INTO inscripciones

VALUES ('Juan', 'PostgreSQL');

Resultado:

ERROR: duplicate key value violates unique constraint


💡 Buenas Prácticas

Utiliza UNIQUE en datos que realmente deban ser únicos

Ejemplos comunes:

email

usuario

rfc

curp

codigo_producto

numero_empleado


Combínalo con NOT NULL cuando corresponda

En muchos casos ambos requisitos son necesarios.

email VARCHAR(200) NOT NULL UNIQUE


Asigna nombres descriptivos a las restricciones

Por ejemplo:

ALTER TABLE usuarios

ADD CONSTRAINT uq_usuarios_email

UNIQUE(email);

Esto facilita la identificación de errores y el mantenimiento de la base de datos.


No agregues UNIQUE innecesariamente

Pregúntate siempre:

¿Este dato realmente debe ser único?

Por ejemplo, normalmente no tendría sentido que el nombre de una persona fuera único:

nombre VARCHAR(100) UNIQUE

Podrían existir múltiples personas llamadas "Juan Pérez".


✅ Conclusión

La restricción UNIQUE permite garantizar que ciertos valores no se repitan dentro de una tabla.

Los conceptos más importantes son:

  • UNIQUE evita valores duplicados.

  • Puede definirse sobre una o varias columnas.

  • Los intentos de insertar valores repetidos generan error.

  • Varias filas pueden contener NULL en una columna UNIQUE.

  • Es habitual combinar UNIQUE con NOT NULL.

  • Se utiliza frecuentemente para correos electrónicos, nombres de usuario, códigos de producto y números de empleado.

Capítulo 004. Adiós a los NgModules