Añadir datos: la sentencia INSERT
Hasta ahora solo hemos leído datos. Pero los datos de las tablas no se quedan quietos: aparecen productos, clientes y pedidos nuevos, y para cada uno hay que añadir una fila a la tabla. Para eso existe la sentencia INSERT.
Estructura general de una consulta con INSERT
INSERT INTO nombre_tabla [(campo_tabla [, ...])]
{ VALUES (valor [, ...]) [, ...] | expresion_select };- [ ]parte opcional
- { a | b }una de las opciones
- ...se puede repetir
- nombre_tabla
- La tabla a la que se añaden los registros.
- campo_tabla
Las columnas que recibirán valores. Sin esta lista, se pasan valores para todas las columnas de la tabla.
Opcional- valor
Un valor para una columna: un número, una cadena, una expresión o NULL. Los valores van en el mismo orden que las columnas. Cada par de paréntesis es una fila; si hay varias filas, se separan con comas.
- expresion_select
Una consulta SELECT cuyas filas de resultado se añaden a la tabla. Debe devolver tantas columnas como las que hayas enumerado.
Subconsulta
Los valores se pasan como una lista después de VALUES o se obtienen con una consulta SELECT.
Enumerar las columnas y asignarles valores
Puedes indicar de forma explícita en qué columnas de la tabla se guardarán los datos. Para ello, enumera los nombres de las columnas entre paréntesis después del nombre de la tabla:
INSERT INTO nombre_tabla (campo_tabla [, ...])
VALUES (valor [, ...]);- [ ]parte opcional
- ...se puede repetir
- nombre_tabla
- La tabla a la que se añaden los registros.
- campo_tabla
La columna en la que se escribe el valor. Las columnas se separan con comas y pueden ir en cualquier orden.
- valor
El valor para la columna que ocupa la misma posición en la lista de columnas.
Reglas importantes:
- El orden de los valores en VALUES debe corresponder exactamente al orden de las columnas enumeradas
- El número de valores debe coincidir con el número de columnas indicadas
- Si una columna no aparece en la lista, recibirá su valor por defecto (si está definido) o NULL (si la columna admite NULL)
Por ejemplo, si la tabla Goods tiene las columnas good_id, good_name y type, las siguientes consultas son equivalentes:
MySQL 8.4-- Indicación explícita de las columnas INSERT INTO Goods (good_id, good_name, type) VALUES (20, 'Table', 8); -- Orden de columnas cambiado: los valores cambian en consecuencia INSERT INTO Goods (good_name, type, good_id) VALUES ('Table', 8, 20);
Si no indicas la lista de columnas, tendrás que dar valores para todas las columnas de la tabla en el orden en que se definieron al crearla:
MySQL 8.4INSERT INTO Goods VALUES (20, 'Table', 8);
Diferencias entre las sintaxis de INSERT
Supón que tienes que añadir un artículo nuevo al catálogo de productos Goods: una mesa. Hay dos formas de hacerlo.
La forma habitual es enumerar los valores después de VALUES:
MySQL 8.4INSERT INTO Goods (good_id, good_name, type) VALUES (20, 'Table', 8);
Pero INSERT no solo acepta una lista ya preparada. En lugar de VALUES puedes poner una consulta SELECT, y en la tabla acabará todo lo que devuelva. Además, SELECT puede prescindir de FROM: si simplemente enumeras valores en él, los devolverá como una sola fila:
MySQL 8.4INSERT INTO Goods (good_id, good_name, type) SELECT 20, 'Table', 8;
Las dos consultas dan el mismo resultado: en Goods ha aparecido una mesa:
| good_id | good_name | type |
|---|---|---|
| 17 17 filas más | airsoft game session | 4 |
| 18 | netflix subscription | 4 |
| 20 | Table | 8 |
Cuándo usar cada forma
Si los valores se conocen de antemano (por ejemplo, porque los ha introducido un usuario), lo más sencillo es INSERT ... VALUES. Con él también puedes añadir varias filas a la vez, cada una entre sus propios paréntesis:
MySQL 8.4INSERT INTO Goods (good_id, good_name, type) VALUES (20, 'Table', 8), (21, 'Chair', 8), (22, 'Lamp', 8);
En cambio, INSERT ... SELECT te saca del apuro cuando las filas nuevas hay que construirlas a partir de lo que ya está en la base de datos: copiar registros (en la misma tabla o en otra) o guardar el resultado de unos cálculos. Por ejemplo, vamos a duplicar todos los alimentos y a dar a las copias números 100 unidades más altos:
MySQL 8.4INSERT INTO Goods (good_id, good_name, type) SELECT good_id + 100, good_name, type FROM Goods WHERE type = 2;
Ejecuta la consulta y mira el final de la tabla: una sola consulta ha añadido tres filas de golpe, copias de bread, milk y potato.
La clave primaria al añadir un registro nuevo
El valor de la clave primaria no puede repetirse en una tabla: si intentas insertar uno que ya existe, obtendrás un error.
¿Qué número está libre? Lo primero que se le ocurre a cualquiera es coger el mayor y sumarle uno:
MySQL 8.4INSERT INTO Goods SELECT MAX(good_id) + 1, 'Table', 8 FROM Goods;
Funciona, pero no es fiable. Si dos consultas así se ejecutan a la vez, pueden obtener el mismo número y una de ellas terminará con error. Además, este método solo sirve para claves numéricas y puede asignar un número que antes pertenecía a un registro eliminado. Si en algún sitio hay datos antiguos que hacen referencia a ese número, quedarán vinculados a la fila nueva 💥. Por eso, en los proyectos reales el número lo asigna la propia base de datos.
Generación automática de la clave primaria
La clave primaria se puede generar automáticamente: para ello, se asigna el atributo AUTO_INCREMENT a la columna good_id. Así, al añadir un registro basta con pasar NULL o 0 en good_id: la columna recibirá por sí sola el siguiente valor del contador, una unidad mayor que el más alto de los ya usados.
MySQL 8.4CREATE TABLE Goods ( good_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, good_name VARCHAR(255), type INT );
MySQL 8.4INSERT INTO Goods VALUES (NULL, 'Table', 8);
Un identificador único se puede generar automáticamente con los tipos SMALLSERIAL, SERIAL y BIGSERIAL. No son tipos de verdad, sino una forma abreviada: una columna con este tipo pasa a ser entera y su valor aumenta automáticamente al añadir un registro nuevo.
MySQL 8.4CREATE TABLE Goods ( good_id SERIAL PRIMARY KEY, good_name VARCHAR(255), type INT );
MySQL 8.4INSERT INTO Goods (good_name, type) VALUES ('Table', 8);
Ponte a prueba
En la tabla Goods ya hay un producto con good_id = 3, y la columna good_id es la clave primaria. ¿Qué pasará al ejecutar esta consulta?
MySQL 8.4INSERT INTO Goods (good_id, good_name, type) VALUES (3, 'chair', 8);