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;
FieldTypeNullKeyDefaultExtra
idintNOPRINULLauto_increment
nombrevarchar(200)NONULL
descripciontextYESNULL
preciodecimal(10,2)NONULL
stockintNO0
categoria_idintYESMULNULL
activotinyint(1)YES1
creado_entimestampYESCURRENT_TIMESTAMPDEFAULT_GENERATED
actualizado_entimestampYESCURRENT_TIMESTAMPDEFAULT_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;
idclavevaloractivo
1modo_mantenimiento1

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