NOT NULL
La restricción NOT NULL garantiza que una columna no pueda contener el valor NULL. Cuando una columna es NOT NULL, cada fila debe tener un valor explícito para esa columna. Es la restricción más básica y una de las más importantes: define qué información es obligatoria en tu tabla.
Sintaxis
CREATE TABLE nombre_tabla (
columna tipo_de_dato NOT NULL
);Por qué usar NOT NULL
NULL en SQL significa "valor desconocido" o "sin valor". Aunque es útil en muchos casos, hay columnas donde un valor nulo no tiene sentido. El nombre de un producto, el email de un usuario o el precio de un artículo son datos que siempre deben existir. Sin NOT NULL, podrías insertar filas con datos incompletos que causen problemas en la aplicación.
En nuestra base de datos tienda_mysql, la tabla productos tiene varias columnas NOT NULL:
DESCRIBE productos;| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | int | NO | PRI | NULL | auto_increment |
| nombre | varchar(200) | NO | NULL | ||
| descripcion | text | YES | NULL | ||
| precio | decimal(10,2) | NO | NULL | ||
| stock | int | NO | 0 | ||
| categoria_id | int | YES | MUL | NULL | |
| activo | tinyint(1) | YES | 1 | ||
| creado_en | timestamp | YES | CURRENT_TIMESTAMP | DEFAULT_GENERATED | |
| actualizado_en | timestamp | YES | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
La columna Null indica NO para id, nombre, precio y stock. Estas columnas son obligatorias. descripcion y categoria_id admiten NULL porque son opcionales.
Definir NOT NULL al crear la tabla
CREATE TABLE contactos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
telefono VARCHAR(20),
mensaje TEXT NOT NULL
);nombre, email y mensaje son obligatorios. telefono es opcional (admite NULL por defecto).
Insertar en columnas NOT NULL
Si intentas insertar una fila sin proporcionar un valor para una columna NOT NULL y la columna no tiene valor por defecto:
INSERT INTO contactos (nombre, email) VALUES ('Ana', 'ana@email.com');ERROR 1364 (HY000): Field 'mensaje' doesn't have a default value
MySQL rechaza la inserción porque mensaje es NOT NULL y no tiene un valor por defecto. Debes proporcionar un valor:
INSERT INTO contactos (nombre, email, mensaje)
VALUES ('Ana', 'ana@email.com', 'Solicitud de información');Query OK, 1 row affected (0.01 sec)
Insertar NULL explícitamente
Intentar insertar NULL directamente en una columna NOT NULL también falla:
INSERT INTO contactos (nombre, email, mensaje)
VALUES ('Luis', NULL, 'Consulta sobre pedido');ERROR 1048 (23000): Column 'email' cannot be null
El error es claro: la columna email no puede ser nula.
NOT NULL con DEFAULT
Puedes combinar NOT NULL con DEFAULT para que la columna tenga un valor automático cuando no se especifica uno:
CREATE TABLE configuracion (
id INT AUTO_INCREMENT PRIMARY KEY,
clave VARCHAR(50) NOT NULL,
valor VARCHAR(255) NOT NULL DEFAULT '',
activo BOOLEAN NOT NULL DEFAULT TRUE
);INSERT INTO configuracion (clave) VALUES ('modo_mantenimiento');Query OK, 1 row affected (0.01 sec)
SELECT * FROM configuracion;| id | clave | valor | activo |
|---|---|---|---|
| 1 | modo_mantenimiento | 1 |
La columna valor recibe la cadena vacía y activo recibe TRUE. La inserción no falla porque ambas columnas tienen valor por defecto, aunque sean NOT NULL.
Actualizar a NULL
La restricción también se aplica en actualizaciones:
UPDATE contactos SET email = NULL WHERE id = 1;ERROR 1048 (23000): Column 'email' cannot be null
No puedes establecer NULL en una columna NOT NULL mediante UPDATE.
Añadir NOT NULL a una columna existente
Para hacer obligatoria una columna que antes admitía nulos, usa ALTER TABLE MODIFY:
ALTER TABLE contactos
MODIFY COLUMN telefono VARCHAR(20) NOT NULL;Esta operación falla si alguna fila tiene NULL en telefono:
ERROR 1138 (22004): Invalid use of NULL value
Primero actualiza los valores nulos:
UPDATE contactos SET telefono = 'Sin teléfono' WHERE telefono IS NULL;
ALTER TABLE contactos
MODIFY COLUMN telefono VARCHAR(20) NOT NULL;Query OK, 0 rows affected (0.04 sec)
Quitar NOT NULL
Para permitir nulos en una columna que antes era obligatoria:
ALTER TABLE contactos
MODIFY COLUMN telefono VARCHAR(20);Al no incluir NOT NULL, la columna vuelve a admitir NULL. Los datos existentes no cambian.
NOT NULL y PRIMARY KEY
Las claves primarias son implícitamente NOT NULL. No necesitas especificarlo, aunque hacerlo no causa error:
-- Ambas son equivalentes
CREATE TABLE ejemplo_a (id INT PRIMARY KEY);
CREATE TABLE ejemplo_b (id INT NOT NULL PRIMARY KEY);NOT NULL y cadena vacía
Es importante distinguir entre NULL y una cadena vacía ''. NULL significa "sin valor" o "desconocido". Una cadena vacía es un valor conocido: una cadena de longitud cero.
INSERT INTO contactos (nombre, email, telefono, mensaje)
VALUES ('Eva', 'eva@email.com', '', 'Hola');Query OK, 1 row affected (0.01 sec)
La inserción funciona porque '' no es NULL. Es un valor válido para una columna NOT NULL. En la práctica, debes decidir si una cadena vacía tiene sentido para tu caso de uso o si es preferible rechazarla con una restricción CHECK.
Buenas prácticas
Marca como NOT NULL las columnas que representan datos esenciales de la entidad. En una tabla de pedidos, el cliente_id y el total deben ser obligatorios. En una tabla de productos, el nombre y el precio son imprescindibles.
Deja como nullable las columnas con información realmente opcional: un número de teléfono secundario, una nota interna, o una fecha que aún no se conoce (como fecha_envio en un pedido que todavía no se ha enviado).
Combina NOT NULL con DEFAULT cuando la columna tiene un valor razonable por defecto: stock con valor 0, activo con valor TRUE, estado con valor 'pendiente'.
Limpieza
DROP TABLE IF EXISTS contactos;
DROP TABLE IF EXISTS configuracion;
DROP TABLE IF EXISTS ejemplo_a;
DROP TABLE IF EXISTS ejemplo_b;En el siguiente artículo veremos la restricción PRIMARY KEY, que identifica de forma única cada fila de una tabla.
Escrito por Eduardo Lázaro
