Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   función LAST_INSERT_ID() en MySQL (https://www.clubdelphi.com/foros/showthread.php?t=94632)

wilcg 04-05-2020 05:37:10

función LAST_INSERT_ID() en MySQL
 
Amigos un saludo,
Es un problema común, lo que quiero es vincular registros mediante un ID, He estado revisando por la red sobre como capturar el ID de un campo AUTO_INCREMENT en Mysql, y me he topado con estas funciones SQL mysql_insert_id() y LAST_INSERT_ID().
la información que he encontrado no es muy entendible, mi consulta va a los expertos del club para sacarme de dudas.

lo que quiero es grabar el ID correcto de un campo de una tabla maestra, en los demás campos de las tablas secundarias.
En una suposición en el ejemplo de abajo, En un ambiente de uso de múltiples usuarios conectados, al mismo tiempo realizando INSERT en la tabla. Mi pregunta va

¿capturará el ID del registro indicado?
¿podría capturar el ID del registro de otro usuario que en ese mismo instante lo esta dando guardar?
son dudas de novato, pero son importantes corregirlas para el funcionamiento correcto de la aplicación.

esta es la tabla
Código SQL [-]
CREATE TABLE `articulos` (
  `id_articulo` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `marca` VARCHAR(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY USING BTREE (`id_articulo`)
) ENGINE=InnoDB
AUTO_INCREMENT=1 ROW_FORMAT=DYNAMIC CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'
;
Código:
Utilizando la funcion de mysql LAST_INSERT_ID(), obtengo el ID del registro insertado y luego lo registro en las siguientes tablas.
Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO articulo ( ');
Query1.Query1.SQL.Add('nombre, marca ) VALUES ( :nombre, :marca ');
Query1.ParamByName('nombre').AsString := txtNombre.Text;
Query1.ParamByName('marca').AsString   := txtMarca.Text;
Query1.ExecSQL;
Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO precio1 ( ');
Query1.Query1.SQL.Add('id_articulo, precio ) VALUES ( LAST_INSERT_ID(), :precio');
Query1.ParamByName('precio').AsCurrency := txtPrecio1.Value;
Query1.ExecSQL;

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO precio2 ( ');
Query1.Query1.SQL.Add('id_articulo, precio ) VALUES ( LAST_INSERT_ID(), :precio');
Query1.ParamByName('precio').AsCurrency := txtPrecio2.Value;
Query1.ExecSQL;

delphi.com.ar 04-05-2020 23:35:16

Es muy simple, LAST_INSERT_ID() devuelve el ID autogenerado (AUTO_INCREMENT) más recientemente de la conexión, o sea que si otro cliente realiza un insert, no lo afectaría.

A simple vista el código que estás mostrando, si se ejecuta secuencialmente, estaría haciendo lo siguiente
  1. Insertando un registro en la tabla 'articulos' por lo que LAST_INSERT_ID() tendrá el último ID autogenerado de esta tabla.
  2. Insertando un registro en la tabla 'precio1', utilizando el ID del último registro insertado del la tabla 'articulos', pero ahora LAST_INSERT_ID() tendrá el último ID autogenerado de esta 'precio1'.
  3. Insertando un registro en la tabla 'precio2', utilizando el ID del último registro insertado del la tabla 'precio1', pero ahora LAST_INSERT_ID() tendrá el último ID autogenerado de esta 'precio2'.


Calculo que la intención es que ambas tablas 'precio1' y 'precio2' hagan referencia al último ID insertado en la tabla artículos, y para eso tendrás que hacer lo siguiente:
  1. Insertar un registro en la tabla 'articulos'
  2. Consultar y mantener en una variable el valor de LAST_INSERT_ID().
  3. Hacer los inserts en el resto de las tablas.

En MySql sería simplemente:
Código SQL [-]
INSERT INTO articulos (nombre, marca) VALUES ('NOMBRE', 'MARCA');
SELECT LAST_INSERT_ID() INTO @last_articulo_id;
INSERT INTO precio1 (id_articulo, precio) VALUES ( @last_articulo_id, 1.50);
INSERT INTO precio2 (id_articulo, precio) VALUES ( @last_articulo_id, 1.50);


Saludos!

wilcg 05-05-2020 15:32:54

delphi.com.ar,
Excelente aclaración justo lo necesario, gracias.


La franja horaria es GMT +2. Ahora son las 20:13:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi