En esta guía aprenderás cómo insertar y gestionar registros en tablas de bases de datos usando sentencias INSERT en MySQL, incluyendo técnicas efectivas para manejar claves duplicadas con sentencias como IGNORE y ON DUPLICATE KEY UPDATE. Dominar estas acciones ayuda a mantener la integridad y coherencia de los datos según la lógica de negocio.
¿Cómo insertar registros de forma sencilla en MySQL?
El comando básico para insertar información en cualquier tabla de una base de datos es INSERT. Debemos especificar claramente los nombres de tabla, columnas y valores correspondientes:
Al hacerlo, MySQL asigna automáticamente valores incrementales a columnas específicas (por ejemplo, product_id). Podemos insertar múltiples registros agregando más tuplas separadas por comas:
La inserción no se realiza, pero no genera error, solo una advertencia:
0 rows affected,1 warning
¿Cómo gestionar registros duplicados con ON DUPLICATE KEY UPDATE?
Usar ON DUPLICATE KEY UPDATE ofrece una solución más útil y profesional para gestionar conflictos de claves duplicadas. Permite actualizar información de registros existentes en lugar de intentar insertar duplicados:
INSERTINTO products (name, slug)VALUES('pluma azul','pluma-azul')ONDUPLICATEKEYUPDATE description ='actualizado por duplicidad';
Este método ejecuta una actualización en lugar de reportar un error o advertencia, algo especialmente útil en escenarios prácticos.
el incremental paso de 1 a 3, esto a que es debido? hay una forma de prevenirlo?
Creo que es debido al error que produjo el profesor cuando intentó poner el slug duplicado.
El valor del "incremental" fue aumentado ya que la tabla toma incluso los errores como valores ya ingresados por eso es que si hay errores en ese caso también serán contados y aumentara automáticamente
UPDATE products SET price=RAND()*100
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
0,015 sec
Si les sale ese error, pueden utilizar un WHERE para solucionarlo: UPDATE products SET price=RAND()*100 WHERE product_id > 0;
gracias!
Bueno no es tan sencillo entenderlo pero explicas muy bien.
El profesor utilizó una analogía en la programación, que el 'ON DUPLICATE KEY UPDATE' viene siendo el equivalente a un Try-Catch sentence, si algo ocurre mal continua la ejeción solo que se ejecuta lo que haya después de ON DUPLICATE KEY UPDATE.
Mi pregunta es, ¿Es recomendable tener una columna en cada tabla tipo Log en que se pueda de alguna manera registrar el evento del warning si algo pasa mal?
Se puede hacer, sí, incluso centralizar todo en una sola tabla de log (para todas las otras tablas). Pero por un lado es ir guardando errores de algo que no debería pasar, mejor tener claros los try/catch en la capa de Modelo de nuestra aplicación e ir evitando que esto suceda.
deberían colocar la barra del reproductor de video más abajo, ya que siempre queda encima de la línea donde esta escribiendo el profesor y al pausar no se lle bien el comando.
Estoy ejecutando muchos de los comandos desde MySQL Workbench y me salió un warning al utilizar values(col).
Por lo visto en nuevas versiones de MySQL prefieren otra forma de hacerlo (no aplica a versiones anteriores a MySQL 8 ni a MariaDB.
Pide crear un alias en la inserción (yo utilicé new_products) y después en lugar de values(col), llamar a alias.col
En tiendo que, como se hiceron varios INSERT que generaron unos warning MySQL iba incrementado el products_id por eso el ultimo dato insertado quedo con products_id 23.
¿Es posible utilizar esos products_id del 6 al 22 si los coloco manuelamente antes de insertar otros datos a la tabla?
Si es posible asignarlos manualmente, solo debes agregar en prodct_id, es decir:
insert into products(product_id, name, slug) values(6,'micropunta', 'slug-micropunta');
Por como está el orden de las clases quizá si siguieron los pasos del profesor al consultar la tabla productos no les aparecerá esas columnas de created_at y updated_at, pero con los conocimientos adquiridos hasta ahora podemos modificar las tablas y agregar las columnas!
ALTER TABLE products add column created_at timestamp not null default CURRENT_TIMESTAMP;
y
ALTER TABLE products add column updated_at timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP;
En caso que estes trabajando con postgres (y no con mysql) puedes reemplazar el comando rand() por random()
Gracias por todo profe.
es una pregunta tonta pero como pego en sql le dio control V y no me lo hace
Las claves primarias (primary keys) en una base de datos no necesitan ser secuenciales. Es normal que existan saltos, especialmente si se eliminan registros. Esto no afecta la integridad de la base de datos. Sin embargo, si se desea mantener un orden visible, se puede considerar la creación de un campo adicional que refleje el orden deseado.
Para solucionarlo, se puede usar un campo de tipo "AUTO_INCREMENT" para la clave primaria y un campo adicional que almacene el orden si es necesario. Esto permite mantener la unicidad y el rendimiento de la base de datos sin comprometer la lógica de negocio.
El incremento de 1 a 3 en un ID autogenerado puede deberse a que MySQL maneja internamente el autoincremento y, si se producen errores en inserciones, esos IDs se saltan. Por ejemplo, si intentas insertar un registro y falla por una clave duplicada, el ID no se reutiliza.
Para prevenir problemas relacionados, asegúrate de manejar correctamente los errores en tus inserciones. Utiliza INSERT IGNORE o ON DUPLICATE KEY UPDATE para controlar la lógica en caso de conflictos. Esto te ayudará a mantener la integridad de los datos y gestionar mejor los registros sin saltos inesperados en los IDs.
@profe. El algún otro SQL se usa el símbolo pipe(|) para concatenate. Consulta: exuste algún SQL standard para ser manejado por cualquier motos de base de datos? o es que es particular la sintaxis de cada motor, yo estoy dando fin a mi uso de msAccess y evolucionando a otra bases de datos, entonces me dí cuenta de algunas diferencias. gracias, está muy bueno el curso.