【Tutorial de SQL INSERT】Cómo Añadir Nuevos Datos a una Tabla con la Sentencia INSERT INTO
Registro de usuarios en un sitio web, nuevas entradas en un blog, registro de productos en un sitio de comercio electrónico... Las aplicaciones web cobran vida porque constantemente se están creando nuevos datos. La operación fundamental y más importante de "registrar nuevos datos en una base de datos" es manejada por la sentencia INSERT de SQL.
La sentencia INSERT es un comando para escribir una nueva fila en el gran libro de contabilidad que es una base de datos. Su sintaxis puede parecer simple a primera vista, pero ofrece una variedad de usos, desde añadir una sola fila hasta la inserción masiva de múltiples filas, e incluso copiar datos desde otra tabla. Sin embargo, debido a su simplicidad, un pequeño error puede llevar fácilmente a un fallo, convirtiéndolo en un punto de tropiezo común para los principiantes.
Este artículo explicará a fondo todo lo necesario para dominar la sentencia INSERT, desde la sintaxis básica hasta aplicaciones prácticas, así como los errores frecuentes y sus soluciones, todo acompañado de mucho código "copiar-pegar-y-ejecutar". ¡Demos el primer paso en el mundo de SQL ejecutando el código y sintiendo la satisfacción de que "los datos se están añadiendo"!
Preparación: Preparemos una Tabla para los Datos
Para añadir datos, primero necesitas un "contenedor" para ponerlos, es decir, una tabla. Esta vez, vamos a crear una tabla llamada products para gestionar la información de nuevos productos. Usaremos esta tabla a lo largo de todo el artículo.
Presta atención al INTEGER PRIMARY KEY de la columna id. En muchas bases de datos (como SQLite, o usando AUTO_INCREMENT en MySQL), esta configuración asigna automáticamente un ID único cada vez que añades datos. Esto será importante más adelante.
-- Si la tabla products existe, la elimina (para pruebas repetibles)
DROP TABLE IF EXISTS products;
-- Crea una nueva tabla products
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
category TEXT,
price INTEGER,
release_date DATE
);
Con esto, tenemos una tabla vacía lista para los datos de los productos. Empecemos a darle vida a esta tabla de inmediato.
【Lo Básico】INSERT INTO ... VALUES: Añadiendo una Sola Fila de Datos
Primero, veamos la forma básica de la sentencia INSERT: "añadir una sola fila de datos". La sintaxis es INSERT INTO nombre_tabla (columna1, columna2, ...) VALUES (valor1, valor2, ...);. La clave es que la lista de columnas en el primer conjunto de paréntesis se corresponde uno a uno con la lista de valores después de VALUES.
INSERT INTO products (name, category, price, release_date)
VALUES ('Manzana Milagrosa', 'Alimentos', 500, '2025-07-01');
Cuando ejecutas esta consulta, se añade un nuevo producto a la tabla products. No especificamos la columna id, pero como la configuramos para que genere números automáticamente al crear la tabla, la base de datos le asigna automáticamente el valor 1. Esta es una gran ventaja de usar una clave primaria autoincremental.
Vamos a comprobar si se añadió. Si ejecutas SELECT * FROM products;, deberías ver los datos que acabas de insertar.
SELECT * FROM products;
Resultado:
id | name | category | price | release_date
---|-------------------|-----------|-------|-------------
1 | Manzana Milagrosa | Alimentos | 500 | 2025-07-01
Además, si los valores para algunas columnas aún no están decididos (limitado a columnas que permiten NULL), puedes omitir esas columnas al insertar.
-- Insertar omitiendo precio (price) y fecha de lanzamiento (release_date)
INSERT INTO products (name, category)
VALUES ('Melocotón Fantasma', 'Alimentos');
En este caso, price y release_date contendrán NULL (ningún valor).
【Aplicación 1】Añadiendo Múltiples Filas de Datos a la Vez
Registrar nuevos productos uno por uno puede ser un poco tedioso. Con la sentencia INSERT, puedes añadir múltiples datos a la vez en una sola consulta.
La sintaxis es simple: simplemente enumera múltiples listas de valores entre paréntesis () después de la palabra clave VALUES, separadas por comas (,). Esto es más eficiente que repetir la sentencia INSERT para cada fila, ya que solo requiere un viaje de ida y vuelta a la base de datos.
INSERT INTO products (name, category, price, release_date) VALUES
('Teclado Mágico', 'Gadgets', 12000, '2025-07-10'),
('Ratón Arcoíris', 'Gadgets', 5000, '2025-07-20'),
('Uvas Celestiales', 'Alimentos', 2500, '2025-08-01');
Con esta única consulta, se han añadido tres registros de productos a la vez. Esta es una técnica muy útil para tareas como poblar datos iniciales o registrar datos cargados desde un archivo CSV en bloque.
【Aplicación 2】Copiando Datos de Otra Tabla con `INSERT ... SELECT`
Esta es una técnica muy poderosa para usuarios de nivel intermedio. La sentencia INSERT ... SELECT te permite tomar el resultado de una consulta SELECT de otra tabla e insertarlo directamente en una nueva tabla.
Esto es extremadamente útil en escenarios como mover productos de una tabla de "lista de novedades" (new_arrivals) a la tabla principal products una vez que se ha confirmado su lanzamiento.
Primero, creemos la tabla de origen, new_arrivals, y poblemosla con algunos datos.
-- Crear la tabla de origen
CREATE TABLE new_arrivals (
product_name TEXT NOT NULL,
product_category TEXT,
list_price INTEGER,
launch_date DATE,
is_confirmed INTEGER -- 1 si el lanzamiento está confirmado, 0 en caso contrario
);
-- Poblar la lista de novedades
INSERT INTO new_arrivals VALUES
('Auriculares Definitivos', 'Audio', 28000, '2025-09-01', 1),
('Gafas de RV del Futuro', 'Gadgets', 75000, '2025-10-01', 1),
('Cafetera Totalmente Automática', 'Electrodomésticos', 18000, '2025-09-15', 0);
Estamos listos. Ahora, seleccionemos solo los productos de la tabla new_arrivals que están confirmados para su lanzamiento (is_confirmed = 1) y añadámoslos a nuestra tabla products.
INSERT INTO products (name, category, price, release_date)
SELECT product_name, product_category, list_price, launch_date
FROM new_arrivals
WHERE is_confirmed = 1;
El punto clave de esta consulta es que se utiliza una sentencia SELECT en lugar de la cláusula VALUES. La estructura de columnas del conjunto de resultados de la sentencia SELECT (número de columnas, orden y tipos de datos) debe coincidir con la estructura de columnas especificada en INSERT INTO products (...). Esto tiene una amplia gama de usos, como la creación de copias de seguridad de datos o el guardado de resultados agregados en otra tabla.
Errores Comunes de INSERT y Cómo Solucionarlos
La sentencia INSERT devolverá inmediatamente un error si violas cualquiera de las reglas (restricciones) de la base de datos. Veamos algunos de los errores más comunes que encuentran los principiantes, sus causas y cómo solucionarlos.
Error 1: Violación de Clave Primaria
Este es el error más común. Una clave primaria es un identificador único dentro de una tabla que nunca debe duplicarse. Si estás especificando los IDs manualmente e intentas usar un ID que ya existe, obtendrás un error.
Por ejemplo, la "Manzana Milagrosa" con ID=1 ya está registrada. Si intentamos registrar otro producto con ID=1...
-- ¡Esto causará un error!
INSERT INTO products (id, name, category, price, release_date)
VALUES (1, 'Otra Manzana', 'Alimentos', 300, '2025-07-02');
Ejecutar esto mostrará un mensaje de error como UNIQUE constraint failed: products.id o Duplicate entry '1' for key 'PRIMARY'.
Solución: El enfoque más seguro y fiable es no gestionar las claves primarias manualmente, sino dejar que la función de autoincremento de la base de datos se encargue de ello. Como en nuestro primer ejemplo, simplemente omite el id de la lista de columnas en tu sentencia INSERT.
Error 2: Violación de Restricción NOT NULL
Las columnas especificadas con NOT NULL cuando se creó la tabla siempre deben tener un valor. Intentar insertar una fila omitiendo dicha columna resultará en un error.
La columna name en nuestra tabla products es NOT NULL. Si intentamos insertar sin especificar un name...
-- ¡Esto también causará un error!
INSERT INTO products (category, price)
VALUES ('Otro', 1000);
Verás un error como NOT NULL constraint failed: products.name.
Solución: Proporciona siempre algún valor para las columnas con una restricción NOT NULL. Si quieres permitir una cadena vacía, debes especificarla explícitamente, como ''.
Error 3: Discrepancia de Tipos de Datos
Obtendrás un error si intentas insertar datos de un tipo diferente al que se definió para la columna. Por ejemplo, intentar insertar una cadena en la columna price, que es de tipo entero (INTEGER).
-- ¡Esto por supuesto causará un error!
INSERT INTO products (name, price)
VALUES ('Piedra Cara', 'El precio es un secreto');
Esto producirá un error como Datatype mismatch o Incorrect integer value: 'El precio es un secreto' for column 'price'.
Solución: Revisa cuidadosamente la definición de tu tabla y proporciona valores del tipo de datos correcto para cada columna. Ten cuidado con errores comunes como envolver números entre comillas (p. ej., '500'), lo que los convierte en cadenas.
【Patio de Recreo Interactivo】¡Añadamos Datos Ejecutando SQL en el Navegador!
¡Ahora es el momento de convertir el conocimiento en una habilidad! Copia todo el código HTML a continuación, guárdalo como un archivo llamado sql_insert_test.html y ábrelo en tu navegador. Se iniciará tu propio entorno SQL privado, con la tabla products que creamos en este artículo lista para usar.
Siéntete libre de escribir tu propia sentencia INSERT y presionar "Ejecutar", luego escribe SELECT * FROM products; justo debajo y presiona "Ejecutar" de nuevo para confirmar que los datos realmente se añadieron. ¡Causar errores intencionadamente también es una excelente manera de aprender!
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Entorno en Línea para la Sentencia SQL INSERT</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1 { color: #2c3e50; }
textarea { width: 100%; height: 180px; font-family: "SF Mono", "Consolas", monospace; font-size: 16px; padding: 12px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; margin-bottom: 1rem; }
button { background-color: #27ae60; color: white; border: none; padding: 12px 22px; font-size: 16px; border-radius: 6px; cursor: pointer; transition: background-color 0.2s; }
button:hover { background-color: #229954; }
button:disabled { background-color: #bdc3c7; cursor: not-allowed; }
#result-container { margin-top: 2rem; border: 1px solid #ddd; padding: 1rem; border-radius: 6px; background: #fdfdfd; min-height: 50px; }
#status-message { color: #27ae60; font-weight: bold; }
#error-message { color: #e74c3c; font-weight: bold; }
table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<h1>¡Probemos SQL!</h1>
<p>Introduce una sentencia SQL en el área de texto de abajo y haz clic en el botón "Ejecutar". ¡Intenta insertar un producto que te hayas inventado!</p>
<textarea id="sql-input">-- Escribe aquí tus sentencias INSERT o SELECT
INSERT INTO products (name, category, price, release_date)
VALUES ('Silla de Gravedad Cero', 'Muebles', 45000, '2025-11-11');
SELECT * FROM products;
</textarea>
<button id="execute-btn">Ejecutar</button>
<div id="result-container">
<p id="status-message"></p>
<p id="error-message"></p>
<div id="result-output"></div>
</div>
<script>
const sqlInput = document.getElementById('sql-input');
const executeBtn = document.getElementById('execute-btn');
const statusMsg = document.getElementById('status-message');
const errorMsg = document.getElementById('error-message');
const resultOutput = document.getElementById('result-output');
let db;
async function initDb() {
executeBtn.disabled = true;
executeBtn.textContent = 'Inicializando BD...';
try {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
const setupSql = `
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
category TEXT,
price INTEGER,
release_date DATE
);
`;
db.run(setupSql);
executeBtn.disabled = false;
executeBtn.textContent = 'Ejecutar';
statusMsg.textContent = '¡Todo listo! Prueba a añadir datos con una sentencia INSERT y comprueba el resultado con una sentencia SELECT.';
} catch (err) {
errorMsg.textContent = 'Error al inicializar la base de datos: ' + err.message;
console.error(err);
}
}
function executeSql() {
if (!db) return;
const sql = sqlInput.value;
statusMsg.textContent = '';
errorMsg.textContent = '';
resultOutput.innerHTML = '';
try {
const statements = sql.split(';').filter(s => s.trim() !== '');
let lastResult;
statements.forEach(stmt => {
const trimmedStmt = stmt.trim();
if (trimmedStmt.toUpperCase().startsWith('INSERT') || trimmedStmt.toUpperCase().startsWith('UPDATE') || trimmedStmt.toUpperCase().startsWith('DELETE')) {
db.run(trimmedStmt);
const changes = db.getRowsModified();
statusMsg.innerHTML += `Consulta "${trimmedStmt.substring(0, 30)}..." ejecutada, ${changes} fila(s) modificada(s).<br>`;
} else {
const results = db.exec(trimmedStmt);
lastResult = results;
}
});
if (lastResult && lastResult.length > 0) {
lastResult.forEach(result => {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const bodyRow = document.createElement('tr');
row.forEach(cellValue => {
const td = document.createElement('td');
td.textContent = cellValue === null ? 'NULL' : cellValue;
bodyRow.appendChild(td);
});
tbody.appendChild(bodyRow);
});
table.appendChild(thead);
table.appendChild(tbody);
resultOutput.appendChild(table);
});
}
} catch (err) {
errorMsg.textContent = 'Error de SQL: ' + err.message;
console.error(err);
}
}
executeBtn.addEventListener('click', executeSql);
initDb();
</script>
</body>
</html>
Amigos de INSERT: Operaciones CRUD
Ahora que has aprendido INSERT, has adquirido uno de los cuatro poderes fundamentales de la manipulación de bases de datos. Estas cuatro operaciones se conocen por el acrónimo CRUD, y forman la base de las operaciones de datos en todas las aplicaciones.
- C (Create - Crear): Crear nuevos datos → Sentencia
INSERT(¡la que aprendimos hoy!) - R (Read - Leer): Leer datos → Sentencia
SELECT - U (Update - Actualizar): Actualizar datos existentes → Sentencia
UPDATE - D (Delete - Borrar): Borrar datos existentes → Sentencia
DELETE
Ya estás familiarizado con SELECT. Ahora que puedes "añadir" datos, tus próximos pasos podrían ser aprender a "actualizarlos" (UPDATE) o "borrarlos" (DELETE), lo que ampliará aún más el rango de lo que puedes hacer con una base de datos.
Conclusión
En este artículo, hemos echado un vistazo detallado a la sentencia INSERT para añadir nuevos datos a una base de datos, cubriendo todo, desde lo básico hasta aplicaciones avanzadas y errores comunes.
- Sintaxis Básica:
INSERT INTO tabla (columnas...) VALUES (valores...);es la base de todo. - Claves Primarias: Configurarlas para que se autoincrementen permite que la base de datos gestione los IDs de forma segura y fiable.
- INSERT de Múltiples Filas: Encadenar múltiples listas de valores con comas después de la cláusula
VALUESpermite un registro masivo eficiente. - INSERT SELECT: Una técnica poderosa para añadir datos al por mayor desde otra tabla.
- Manejo de Errores: Los tres grandes son "Violación de Clave Primaria", "Violación de NOT NULL" y "Discrepancia de Tipos de Datos". No dan miedo una vez que entiendes la causa.
La sentencia INSERT es el primer paso para dar vida a tus sitios web y aplicaciones, registrar las acciones de los usuarios y enriquecer tu contenido. Practica una y otra vez en el patio de recreo de este artículo para familiarizarte con la adición de datos libremente. Esta acumulación de pequeños éxitos seguramente te guiará en tu camino para convertirte en un creador web de primer nivel.