viernes, 17 de julio de 2026

🐘 NULL y NOT NULL en PostgreSQL

Hasta ahora hemos aprendido a crear tablas y manipular datos mediante INSERT, SELECT, UPDATE y DELETE. Sin embargo, todavía no hemos hablado de una pregunta fundamental:

¿Qué ocurre cuando no conocemos el valor de un dato?

Para responder esta pregunta, PostgreSQL utiliza el concepto de NULL.


🧠 ¿Qué es NULL?

NULL representa la ausencia de un valor.

No significa:

  • Cero (0)
  • Cadena vacía ('')
  • Espacio en blanco (' ')

Significa simplemente:

"No existe un valor almacenado para esta columna."

Por ejemplo, supongamos una tabla de empleados:

idnombretelefono
1Juan Pérez555123456
2Ana LópezNULL

En este caso, no sabemos el teléfono de Ana López o simplemente no se ha registrado.


📦 ¿Cuándo utilizar NULL?

Algunos ejemplos comunes son:

  • Un cliente aún no ha proporcionado su teléfono.
  • Un empleado no tiene fecha de baja.
  • Un producto todavía no tiene descripción.
  • Un pedido aún no ha sido entregado.

En estos casos, permitir valores NULL tiene sentido.


🔒 ¿Qué es NOT NULL?

NOT NULL es una restricción que obliga a proporcionar un valor para una columna.

Cuando una columna tiene la restricción NOT NULL:

✅ Se debe proporcionar un valor.

❌ No se permite almacenar NULL.


🏗️ Crear una tabla con NOT NULL

Supongamos que estamos creando una tabla de empleados.

CREATE TABLE empleados (
id INTEGER NOT NULL,
nombre VARCHAR(100) NOT NULL,
departamento VARCHAR(100),
salario NUMERIC(10,2)
);

En este ejemplo:

  • id es obligatorio.
  • nombre es obligatorio.
  • departamento es opcional.
  • salario es opcional.

✅ Insertar datos válidos

Este INSERT funciona correctamente:

INSERT INTO empleados (
id,
nombre,
departamento,
salario
)
VALUES (
1,
'Juan Pérez',
'Tecnología',
25000.00
);

Todos los campos obligatorios contienen un valor.


❌ Intentar insertar NULL en una columna NOT NULL

Ahora intentemos insertar un empleado sin nombre.

INSERT INTO empleados (
id,
nombre,
departamento,
salario
)
VALUES (
2,
NULL,
'Finanzas',
30000.00
);

PostgreSQL devolverá un error similar a:

ERROR: null value in column "nombre"
violates not-null constraint

Esto ocurre porque la columna nombre fue definida como NOT NULL.


❌ Omitir una columna obligatoria

También obtendremos un error si omitimos una columna obligatoria.

INSERT INTO empleados (
id,
departamento
)
VALUES (
3,
'Recursos Humanos'
);

Resultado:

ERROR: null value in column "nombre"
violates not-null constraint

Aunque no escribimos explícitamente NULL, PostgreSQL intentó asignarlo automáticamente al no encontrar un valor para la columna.


✅ Insertar NULL en columnas que lo permiten

Las columnas sin NOT NULL aceptan valores nulos.

INSERT INTO empleados (
id,
nombre,
departamento,
salario
)
VALUES (
4,
'Ana López',
NULL,
NULL
);

Este registro se insertará correctamente.


🔍 Consultar valores NULL

Veamos los datos:

SELECT *
FROM empleados;

Resultado:

id | nombre | departamento | salario
----+-------------+--------------+----------
1 | Juan Pérez | Tecnología | 25000.00
4 | Ana López | NULL | NULL


⚠️ Comparar NULL correctamente

Uno de los errores más comunes es intentar buscar valores NULL utilizando el operador =.

❌ Incorrecto

SELECT *
FROM empleados
WHERE departamento = NULL;

Esta consulta no devolverá resultados.


Forma correcta

Para buscar valores nulos se utilizan:

IS NULL

o

IS NOT NULL


Buscar registros con NULL

SELECT *
FROM empleados
WHERE departamento IS NULL;


Buscar registros con valor

SELECT *
FROM empleados
WHERE departamento IS NOT NULL;


🧪 Ejemplo completo

Crear tabla

CREATE TABLE productos (
codigo INTEGER NOT NULL,
nombre VARCHAR(100) NOT NULL,
descripcion TEXT,
precio NUMERIC(10,2),
fecha_alta DATE
);


Insertar registro válido

INSERT INTO productos (
codigo,
nombre,
descripcion,
precio,
fecha_alta
)
VALUES (
1001,
'Laptop',
'Equipo portátil',
18000.00,
'2026-07-01'
);


Insertar registro con campos opcionales

INSERT INTO productos (
codigo,
nombre
)
VALUES (
1002,
'Monitor'
);

Funciona porque únicamente se omitieron columnas que permiten NULL.


Intentar omitir un campo obligatorio

INSERT INTO productos (
codigo
)
VALUES (
1003
);

Resultado:

ERROR: null value in column "nombre"
violates not-null constraint


🔧 Agregar NOT NULL a una columna existente

También es posible modificar una tabla ya creada.

Por ejemplo:

ALTER TABLE empleados
ALTER COLUMN nombre SET NOT NULL;

A partir de ese momento todos los registros nuevos deberán incluir un valor para nombre.


🔧 Eliminar NOT NULL

Si posteriormente decidimos permitir valores nulos:

ALTER TABLE empleados
ALTER COLUMN nombre DROP NOT NULL;


💡 Buenas prácticas

Usa NOT NULL en datos obligatorios

Generalmente deberían ser obligatorios:

  • Nombre de un cliente
  • Nombre de un producto
  • Correo electrónico (dependiendo del sistema)
  • Fecha de creación
  • Identificadores

Ejemplo:

nombre VARCHAR(100) NOT NULL


No uses NOT NULL en información opcional

Por ejemplo:

  • Segundo apellido
  • Comentarios
  • Observaciones
  • Fecha de baja

Estos campos suelen permitir valores nulos.


Define la obligatoriedad desde el diseño

Es más fácil decidir desde el principio qué datos son obligatorios que modificar tablas con millones de registros posteriormente.


✅ Conclusión

NULL representa la ausencia de un valor, mientras que NOT NULL obliga a que una columna siempre tenga información.

Los conceptos más importantes son:

  • NULL no es cero ni una cadena vacía.
  • Las columnas permiten NULL por defecto.
  • NOT NULL convierte una columna en obligatoria.
  • Intentar insertar NULL en una columna NOT NULL genera un error.
  • Para buscar valores nulos se utiliza IS NULL.
  • Para buscar valores no nulos se utiliza IS NOT NULL.


No hay comentarios:

Publicar un comentario