DEFAULT
La cláusula DEFAULT define el valor que MySQL asigna a una columna cuando no se especifica uno en la sentencia INSERT. Es una forma de establecer valores razonables automáticamente, evitando que el usuario tenga que proporcionarlos en cada inserción. Puedes usar valores literales, expresiones o funciones como valor por defecto.
Sintaxis
CREATE TABLE nombre_tabla (
columna tipo_de_dato DEFAULT valor_por_defecto
);Valores literales
El caso más simple es un valor fijo:
CREATE TABLE articulos (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(200) NOT NULL,
estado VARCHAR(20) NOT NULL DEFAULT 'borrador',
visitas INT NOT NULL DEFAULT 0,
destacado BOOLEAN NOT NULL DEFAULT FALSE,
prioridad TINYINT NOT NULL DEFAULT 3
);INSERT INTO articulos (titulo) VALUES ('Mi primer artículo');SELECT * FROM articulos;| id | titulo | estado | visitas | destacado | prioridad |
|---|---|---|---|---|---|
| 1 | Mi primer artículo | borrador | 0 | 0 | 3 |
Solo proporcionamos el titulo. MySQL asignó automáticamente los valores por defecto al resto de columnas.
DEFAULT en tienda_mysql
Nuestra base de datos usa DEFAULT en varias columnas:
-- productos: stock tiene DEFAULT 0, activo tiene DEFAULT TRUE
-- pedidos: estado tiene DEFAULT 'pendiente', total tiene DEFAULT 0
-- timestamps: creado_en tiene DEFAULT CURRENT_TIMESTAMPCuando insertamos un producto sin especificar el stock:
INSERT INTO productos (nombre, precio, categoria_id)
VALUES ('Producto de prueba', 99.99, 6);El producto se crea con stock = 0, activo = TRUE, y creado_en con la fecha y hora actuales, todo automáticamente gracias a los valores DEFAULT.
Funciones como DEFAULT
MySQL 8.0 permite usar expresiones y funciones como valores por defecto:
CREATE TABLE sesiones (
id INT AUTO_INCREMENT PRIMARY KEY,
token CHAR(36) DEFAULT (UUID()),
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expira_en TIMESTAMP DEFAULT (CURRENT_TIMESTAMP + INTERVAL 24 HOUR)
);Las expresiones deben ir entre paréntesis. CURRENT_TIMESTAMP es una excepción histórica que no requiere paréntesis.
INSERT INTO sesiones (id) VALUES (DEFAULT);
SELECT * FROM sesiones;| id | token | creado_en | expira_en |
|---|---|---|---|
| 1 | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2025-12-15 10:30:00 | 2025-12-16 10:30:00 |
Cada inserción genera un UUID único y calcula la fecha de expiración automáticamente.
CURRENT_TIMESTAMP y ON UPDATE
Para columnas de timestamp, MySQL ofrece un comportamiento especial:
CREATE TABLE registros (
id INT AUTO_INCREMENT PRIMARY KEY,
dato VARCHAR(100),
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);creado_en se establece automáticamente al insertar. actualizado_en se actualiza automáticamente cada vez que se modifica la fila. Es el patrón que usa nuestra tabla productos.
INSERT INTO registros (dato) VALUES ('valor inicial');
SELECT * FROM registros;| id | dato | creado_en | actualizado_en |
|---|---|---|---|
| 1 | valor inicial | 2025-12-15 10:30:00 | 2025-12-15 10:30:00 |
-- Esperar unos segundos y actualizar
UPDATE registros SET dato = 'valor modificado' WHERE id = 1;
SELECT * FROM registros;| id | dato | creado_en | actualizado_en |
|---|---|---|---|
| 1 | valor modificado | 2025-12-15 10:30:00 | 2025-12-15 10:30:05 |
creado_en no cambió, pero actualizado_en refleja el momento de la actualización.
DEFAULT con NOT NULL
Cuando una columna es NOT NULL y tiene DEFAULT, puedes omitirla en el INSERT sin problemas:
INSERT INTO articulos (titulo) VALUES ('Otro artículo');Sin DEFAULT, una columna NOT NULL sin valor en el INSERT produce un error. Con DEFAULT, MySQL usa el valor definido.
Usar DEFAULT explícitamente
Puedes usar la palabra clave DEFAULT en INSERT y UPDATE para solicitar explícitamente el valor por defecto:
INSERT INTO articulos (titulo, estado, visitas)
VALUES ('Artículo especial', DEFAULT, 100);SELECT titulo, estado, visitas FROM articulos WHERE id = 2;| titulo | estado | visitas |
|---|---|---|
| Artículo especial | borrador | 100 |
estado recibe su valor por defecto ('borrador'), mientras que visitas recibe el valor explícito (100).
En UPDATE, puedes restablecer una columna a su valor por defecto:
UPDATE articulos SET estado = DEFAULT WHERE id = 2;Cambiar el valor DEFAULT
Puedes cambiar el valor por defecto sin redefinir la columna completa:
ALTER TABLE articulos
ALTER COLUMN estado SET DEFAULT 'pendiente';A partir de ahora, las nuevas inserciones sin estado explícito usarán 'pendiente' en lugar de 'borrador'. Los datos existentes no cambian.
Para eliminar el valor por defecto:
ALTER TABLE articulos
ALTER COLUMN prioridad DROP DEFAULT;Ahora prioridad no tiene valor por defecto. Si no se especifica en el INSERT y la columna es NOT NULL, MySQL devolverá un error.
DEFAULT NULL
Si una columna admite nulos y no defines un DEFAULT explícito, el valor por defecto implícito es NULL:
CREATE TABLE notas (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(100) NOT NULL,
contenido TEXT -- DEFAULT NULL implícito
);
INSERT INTO notas (titulo) VALUES ('Nota vacía');
SELECT * FROM notas;| id | titulo | contenido |
|---|---|---|
| 1 | Nota vacía | NULL |
Valores por defecto comunes
Estos son los patrones más habituales para cada tipo de dato:
-- Numéricos: cero
cantidad INT DEFAULT 0
precio DECIMAL(10, 2) DEFAULT 0.00
-- Cadenas: cadena vacía o valor descriptivo
estado VARCHAR(20) DEFAULT 'activo'
notas TEXT DEFAULT NULL
-- Booleanos: true o false
activo BOOLEAN DEFAULT TRUE
verificado BOOLEAN DEFAULT FALSE
-- Fechas: fecha/hora actual
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
fecha_registro DATE DEFAULT (CURRENT_DATE)
-- Expresiones (MySQL 8.0+)
uuid CHAR(36) DEFAULT (UUID())
anio_actual INT DEFAULT (YEAR(CURRENT_DATE))Limpieza
DROP TABLE IF EXISTS articulos;
DROP TABLE IF EXISTS sesiones;
DROP TABLE IF EXISTS registros;
DROP TABLE IF EXISTS notas;
-- Limpiar el producto de prueba insertado
DELETE FROM productos WHERE nombre = 'Producto de prueba';En el siguiente artículo veremos la restricción CHECK, que valida los datos según condiciones personalizadas.
Escrito por Eduardo Lázaro
