El síntoma: la lista de columnas y VALUES tienen tamaños diferentes
Cuando escribes una lista explícita de columnas en INSERT, cada fila de VALUES debe aportar el mismo número de expresiones. SQLite lo documenta de forma directa, y PostgreSQL define igualmente la correspondencia entre la lista de columnas de destino y los valores de cada fila.
Este error aparece antes de comprobar muchas otras reglas: el motor ni siquiera puede decidir qué valor pertenece a qué columna.
Ejemplo reproducible: tres columnas y solo dos valores
CREATE TABLE productos (
id INTEGER PRIMARY KEY,
nombre TEXT NOT NULL,
precio NUMERIC DEFAULT 0
);
INSERT INTO productos (id, nombre, precio)
VALUES (1, 'Teclado');La lista de destino contiene id, nombre y precio, pero VALUES aporta dos expresiones. No hay una correspondencia uno a uno.
Corrección 1: omite de la lista la columna que debe usar DEFAULT
INSERT INTO productos (id, nombre)
VALUES (1, 'Teclado');| id | nombre | precio |
|---|---|---|
| 1 | Teclado | 0 |
Corrección 2: proporciona todos los valores declarados
INSERT INTO productos (id, nombre, precio)
VALUES (2, 'Ratón', 24.90);Ambas formas son válidas porque cada expresión de VALUES tiene una columna de destino inequívoca.
Por qué conviene escribir la lista de columnas
Un INSERT sin lista de columnas depende más de la estructura física y del orden definido en la tabla. Escribir INSERT INTO productos (id, nombre, precio) deja visible la intención y permite omitir columnas que deben obtener un valor predeterminado o NULL cuando el esquema lo permite.
Diagnostica por capas: primero comprueba la cantidad y el orden de columnas; después revisa tipos, NOT NULL, UNIQUE, FOREIGN KEY y demás restricciones.
Método de diagnóstico
- Cuenta las columnas de destino.
- Cuenta las expresiones de cada fila de VALUES.
- Comprueba qué columnas pueden omitirse porque tienen
DEFAULT, aceptanNULLo son generadas por el motor. - Revisa el orden para evitar insertar un valor válido en la columna equivocada.
- Solo después diagnostica tipos y restricciones.
Error frecuente: añadir NULL solo para igualar la cantidad
La forma puede quedar correcta y el dato seguir siendo incorrecto
Añadir NULL como relleno no es una solución general: la columna puede ser NOT NULL, tener un DEFAULT mejor o requerir un valor real. Ajusta la lista de columnas a la intención del alta.
Práctica correctiva
Inserta un producto dejando que el precio use DEFAULT
La tabla tiene id, nombre y precio DEFAULT 0. Inserta el producto 3, “Cable”, sin escribir un precio.
Solución razonada
INSERT INTO productos (id, nombre)
VALUES (3, 'Cable');La lista de destino y la fila de valores tienen dos elementos. precio queda fuera de la lista y el motor aplica su valor predeterminado.
Qué debes recordar
- Cada fila de VALUES debe corresponder con la lista de columnas de destino.
- Usar columnas explícitas hace el INSERT más legible y resistente a cambios.
- Omitir una columna no equivale a escribir NULL: pueden intervenir DEFAULT y reglas del esquema.
- Comprueba primero la forma del INSERT y después tipos y restricciones.
Si columnas y valores sí coinciden pero el INSERT sigue fallando, comprueba si algún texto excede el límite de su VARCHAR: cómo diagnosticar un valor demasiado largo para VARCHAR.