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
NULLdará error.
Ejemplo básico de NOT NULL
CREATE TABLE clientes (
id INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100)
);
nombreno puede ser nulo.emailsí 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)
);
nombreypuestosiempre tendrán un valor.salariopuede 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 NULLfuerza a tener siempre un valor.
- Si no especificamos nada, una columna permite
- NOT NULL vs DEFAULT
DEFAULTasigna un valor cuando no se especifica nada.NOT NULLexige que siempre haya un valor.- Pueden combinarse:
edad INT NOT NULL DEFAULT 18;
- NOT NULL vs CHECK
NOT NULLasegura que no falte el dato.CHECKvalida 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 NULLno implica que sea clave primaria.
- Una clave primaria implica automáticamente
Errores comunes con NOT NULL
- Confundir
NULLcon''(cadena vacía)NULL= desconocido.''= valor vacío pero conocido.
- Insertar sin columna obligatoria
INSERT INTO clientes (id) VALUES (3); -- ❌ Error: falta 'nombre' que es NOT NULL - Olvidar
NOT NULLen columnas críticas
Ejemplo: emails o DNI deberían ser siempre obligatorios. - 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 NULLen columnas obligatorias (ej. nombres, fechas de creación). - Combinar con
DEFAULTpara columnas opcionales pero que deben tener valor. - Evitar
NOT NULLen 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 NULLantes 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_idyfechason obligatorios.totalnunca 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 NULLyDEFAULT. - 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,CHECKyPRIMARY 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