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
ypuesto
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.
- Si no especificamos nada, una columna permite
- 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.
- Una clave primaria implica automáticamente
Errores comunes con NOT NULL
- Confundir
NULL
con''
(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 NULL
en 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 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
yfecha
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
yDEFAULT
. - 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
yPRIMARY 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