NOT NULL en SQL: qué es, cómo funciona y ejemplos prácticos

La restricción NOT NULL en SQL se utiliza para impedir que una columna acepte valores nulos.
Esto asegura que cada fila de la tabla tenga siempre un valor válido en esa columna.

👉 Es una de las restricciones más comunes, junto con PRIMARY KEY, UNIQUE y CHECK.

¿Qué significa NULL en SQL?

En SQL, NULL no significa «cero» ni «vacío», sino valor desconocido o inexistente.
Una columna sin restricción puede aceptar NULL, lo que indica que ese dato no fue proporcionado.

Ejemplo:

INSERT INTO empleados (id, nombre, salario)
VALUES (1, 'Ana', NULL);

👉 Aquí, el salario es desconocido, no “0”.

Sintaxis de NOT NULL

CREATE TABLE tabla (
  columna1 TIPO NOT NULL,
  columna2 TIPO
);
  • Si se define una columna como NOT NULL, cada inserción debe proporcionar un valor para ella.
  • Intentar insertar NULL dará error.

Ejemplo básico de NOT NULL

CREATE TABLE clientes (
  id INT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  email VARCHAR(100)
);
  • nombre no puede ser nulo.
  • email sí puede quedar vacío.

Insert válido:

INSERT INTO clientes (id, nombre, email)
VALUES (1, 'Ana', 'ana@mail.com');

Insert inválido:

INSERT INTO clientes (id, nombre)
VALUES (2, NULL);
-- ❌ Error: la columna 'nombre' no puede ser nula

ALTER TABLE para agregar NOT NULL

Podemos añadir o quitar la restricción después de crear la tabla con ALTER TABLE:

ALTER TABLE clientes
MODIFY nombre VARCHAR(100) NOT NULL;

👉 Esto obliga a que nombre siempre tenga un valor.

Para quitar la restricción:

ALTER TABLE clientes
MODIFY nombre VARCHAR(100) NULL;

Ejemplo práctico con datos de empleados

CREATE TABLE empleados (
  id INT PRIMARY KEY,
  nombre VARCHAR(50) NOT NULL,
  puesto VARCHAR(50) NOT NULL,
  salario DECIMAL(10,2)
);
  • nombre y puesto siempre tendrán un valor.
  • salario puede ser nulo (ej. cuando aún no se definió).

Insert válido:

INSERT INTO empleados (id, nombre, puesto)
VALUES (1, 'Luis', 'Programador');

👉 salario será NULL por defecto.

Diferencias entre NOT NULL y otras restricciones

  • NOT NULL vs NULL (por defecto)
    • Si no especificamos nada, una columna permite NULL.
    • NOT NULL fuerza a tener siempre un valor.
  • NOT NULL vs DEFAULT
    • DEFAULT asigna un valor cuando no se especifica nada.
    • NOT NULL exige que siempre haya un valor.
    • Pueden combinarse: edad INT NOT NULL DEFAULT 18;
  • NOT NULL vs CHECK
    • NOT NULL asegura que no falte el dato.
    • CHECK valida condiciones específicas.
    • Ejemplo: salario DECIMAL(10,2) NOT NULL CHECK (salario > 0);
  • NOT NULL vs PRIMARY KEY
    • Una clave primaria implica automáticamente NOT NULL.
    • Pero NOT NULL no implica que sea clave primaria.

Errores comunes con NOT NULL

  1. Confundir NULL con '' (cadena vacía)
    • NULL = desconocido.
    • '' = valor vacío pero conocido.
  2. Insertar sin columna obligatoria INSERT INTO clientes (id) VALUES (3); -- ❌ Error: falta 'nombre' que es NOT NULL
  3. Olvidar NOT NULL en columnas críticas
    Ejemplo: emails o DNI deberían ser siempre obligatorios.
  4. Intentar cambiar una columna con valores nulos a NOT NULL sin limpiarlos ALTER TABLE clientes MODIFY email VARCHAR(100) NOT NULL; -- ❌ Error si existen registros con email NULL

Buenas prácticas con NOT NULL

  • Usar NOT NULL en columnas obligatorias (ej. nombres, fechas de creación).
  • Combinar con DEFAULT para columnas opcionales pero que deben tener valor.
  • Evitar NOT NULL en campos donde la ausencia de datos es legítima (ej. fecha de baja de un empleado).
  • Validar datos en la aplicación para evitar errores al INSERTAR o UPDATE.
  • Revisar con IS NULL antes de modificar restricciones.

Consultas relacionadas con NULL y NOT NULL

  • Encontrar registros con valores nulos:
SELECT * FROM clientes
WHERE email IS NULL;
  • Encontrar registros con valores no nulos:
SELECT * FROM clientes
WHERE email IS NOT NULL;

👉 = y <> no funcionan con NULL. Siempre hay que usar IS NULL o IS NOT NULL.

Ejemplo avanzado: asegurando integridad en pedidos

CREATE TABLE pedidos (
  id INT PRIMARY KEY,
  cliente_id INT NOT NULL,
  fecha DATE NOT NULL,
  total DECIMAL(10,2) NOT NULL DEFAULT 0
);
  • cliente_id y fecha son obligatorios.
  • total nunca será nulo, aunque no se especifique (por defecto será 0).

Esto evita inconsistencias como pedidos sin fecha o sin cliente.

NOT NULL en distintos motores de bases de datos

  • MySQL / MariaDB: soportado con NOT NULL y DEFAULT.
  • PostgreSQL: soportado, permite validaciones más avanzadas con CHECK.
  • SQL Server: soportado.
  • Oracle: soportado.

👉 En todos los casos, es parte del estándar SQL.

Preguntas frecuentes (FAQ)

1. ¿NOT NULL significa que la columna siempre debe tener un valor?
Sí. Al insertar o actualizar, esa columna no puede quedar sin valor.

2. ¿Una clave primaria puede ser NULL?
No. PRIMARY KEY siempre implica NOT NULL.

3. ¿Cuál es la diferencia entre NULL y cadena vacía ''?

  • NULL: valor desconocido.
  • '': valor vacío pero definido.

4. ¿Puedo agregar NOT NULL a una columna que ya tiene valores nulos?
No directamente. Primero hay que actualizar los valores nulos con algún valor válido.

5. ¿NOT NULL mejora el rendimiento?
Sí, ligeramente. El motor puede optimizar consultas sabiendo que no habrá NULL.

Conclusión

La restricción NOT NULL en SQL es una herramienta clave para garantizar la calidad de los datos.

  • Evita que columnas críticas queden vacías.
  • Se combina con DEFAULT, CHECK y PRIMARY KEY.
  • Ayuda a mantener la integridad de la base de datos.

Dominar el uso de NOT NULL es fundamental para diseñar esquemas confiables y profesionales.

Refuerza validaciones de columnas en Claves y restricciones y revisa el Glosario SQL completo

Scroll al inicio