LAST _ INSERT _ ID () MySQL

我有一个 MySQL 的问题,我想一定很容易。在运行以下 MySql 查询时,需要从 table1返回 LAST INSERTED ID:

INSERT INTO table1 (title,userid) VALUES ('test',1);
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

您可以理解,当前代码只返回 table2的 LAST INSERT ID,而不是 table1,即使我在两者之间插入 table2,我如何从 table1获得 ID?

418767 次浏览

您可以将最后一个插入 id 存储在一个变量中:

INSERT INTO table1 (title,userid) VALUES ('test', 1);
SET @last_id_in_table1 = LAST_INSERT_ID();
INSERT INTO table2 (parentid,otherid,userid) VALUES (@last_id_in_table1, 4, 1);

或者从表1中获取最大 id (编辑: 警告。请参阅 Rob Starling 在评论中关于使用 max id 时竞态条件可能出现的错误的说明)

INSERT INTO table1 (title,userid) VALUES ('test', 1);
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(), 4, 1);
SELECT MAX(id) FROM table1;

(警告: 正如 Rob Starling 在评论中指出的)

这使您能够将一行插入到两个不同的表中,并创建对这两个表的引用。

START TRANSACTION;
INSERT INTO accounttable(account_username)
VALUES('AnAccountName');
INSERT INTO profiletable(profile_account_id)
VALUES ((SELECT account_id FROM accounttable WHERE account_username='AnAccountName'));
SET @profile_id = LAST_INSERT_ID();
UPDATE accounttable SET `account_profile_id` = @profile_id;
COMMIT;

如果您需要从 mysql 获得最后一个没有其他查询的自动增量 id,请输入您的代码:

mysql_insert_id();

因为您实际上将前一个 LAST _ INSERT _ ID ()存储到了第二个表中,所以可以从那里获取它:

INSERT INTO table1 (title,userid) VALUES ('test',1);
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT parentid FROM table2 WHERE id = LAST_INSERT_ID();

倒数第二名:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );

只要为 Rodrigo post 添加,就可以使用 SELECT MAX (id) FROM table1; ,而不是在查询中使用 LAST _ INSERT _ ID () ,但必须使用() ,

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)

我们只有一个人输入记录,所以我在插入之后立即执行以下查询:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");


while ($row = $result->fetch_assoc()) {


$id = $row['id'];


}

这将从数据库中检索最后一个 id。

是否有可能将 last _ id _ in _ table1变量保存到一个 php 变量中以便以后使用?

使用 last _ id,我需要在另一个表中附加一些记录,所以我需要:

1)执行 INSERT 并获取 last _ id _ in _ table1

INSERT into Table1(name) values ("AAA");
SET @last_id_in_table1 = LAST_INSERT_ID();

2)对于另一个表中的任何不确定行,使用在插入中生成的 last _ id _ insert 更新这些行。

$element = array(some ids)
foreach ($element as $e){
UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e
}

我在 Bash 也遇到过同样的问题,我现在就在做这样的事情:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"

工作良好: ——但是

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');set @last_insert_id = LAST_INSERT_ID();"
mysql -D "dbname" -e "insert into table2 (id_tab1) values (@last_insert_id);"

没用。因为在第一个命令之后,shell 将从 mysql 注销,并为第二个命令再次登录,然后不再设置变量@last _ insert _ id。 我的解决办法是:

lastinsertid=$(mysql -B -N -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');select LAST_INSERT_ID();")
mysql -D "dbname" -e "insert into table2 (id_tab1) values (${lastinsertid});"

也许有人正在通过 bash 寻找解决方案: -)

对于没有 InnoDB 解决方案: 可以使用过程 don't forgot to set the delimiter for storing the procedure with ;

CREATE PROCEDURE myproc(OUT id INT, IN otherid INT, IN title VARCHAR(255))
BEGIN
LOCK TABLES `table1` WRITE;
INSERT INTO `table1` ( `title` ) VALUES ( @title );
SET @id = LAST_INSERT_ID();
UNLOCK TABLES;
INSERT INTO `table2` ( `parentid`, `otherid`, `userid` ) VALUES (@id, @otherid, 1);
END

你可以利用它。

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;

而不是这个 LAST_INSERT_ID() 试着用这个

mysqli_insert_id(connection)

在触发器 BEFORE _ INSERT 中,这对我有效:

SET @Last_Insrt_Id = (SELECT(AUTO_INCREMENT /*-1*/) /*as  Last_Insert_Id*/
FROM information_schema.tables
WHERE table_name = 'tblTableName' AND table_schema = 'schSchemaName');

或者简单地选择:

SELECT(AUTO_INCREMENT /*-1*/) as Last_Insert_Id
FROM information_schema.tables
WHERE table_name = 'tblTableName' AND table_schema = 'schSchemaName');

如果需要,请删除注释 /*-1*/并在其他情况下进行测试。 对于多种用途,我可以编写一个函数。这很容易。

我们还可以使用 $con-> insert _ id; //创建连接

    $conn = new mysqli($servername, $username, $password, $dbname);
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";


if ($conn->query($sql) === TRUE) {
$last_id = $conn->insert_id;
echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}

我的代码对我不起作用。任何想法恢复我的 ID 的最后插入这是我的代码,我是新开发,我不知道很多

我在查询中出错了,我不知道如何发送 $session-> msg (‘ s’,“ Product add 顺利添加。进行成本配置”。LAST _ INSERT _ ID () ;

已验证并正确连接数据库和字段。

<?php
if(isset($_POST['add_producto'])){
$req_fields = array( 'nombre', 'categoria', 'proveedor');
validate_fields($req_fields);
if(empty($errors)){
$codigobarras  = remove_junk($db->escape($_POST['codigobarras']));
$identificador   = remove_junk($db->escape($_POST['identificador']));
$nombre   = remove_junk($db->escape($_POST['nombre']));
$categoria   =  (int)$db->escape($_POST['categoria']);
$etiquetas   =  remove_junk($db->escape($_POST['etiquetas']));
$unidadmedida   =  remove_junk($db->escape($_POST['unidadmedida']));
$proveedor   =  remove_junk($db->escape($_POST['proveedor']));
$fabricante   =  remove_junk($db->escape($_POST['idfabricante']));
$maximo   =  remove_junk($db->escape($_POST['maximo']));
$minimo   =  remove_junk($db->escape($_POST['minimo']));
$descripcion   =  remove_junk($db->escape($_POST['descripcion']));
$dias_vencimiento   =  remove_junk($db->escape($_POST['dias_vencimiento']));
      

$servicio   = "0";
if (isset($_POST['servicio'])){
$servicio =implode($_POST['servicio']);
}
$numeroserie   = "0";
if (isset($_POST['numeroserie'])){
$numeroserie =implode($_POST['numeroserie']);
}


$ingrediente   =  "0";
if (isset($_POST['ingrediente'])){
$ingrediente =implode($_POST['ingrediente']);
}


$date    = make_date();
$query  = "INSERT INTO productos (";
$query .=" codigo_barras,identificador_producto,nombre,idcategoria,idetiquetas,unidad_medida,idproveedor,idfabricante,max_productos,min_productos,descripcion,dias_vencimiento,servicio,numero_serie,ingrediente,activo";
$query .=") VALUES (";
$query .=" '{$codigobarras}', '{$identificador}', '{$nombre}', '{$categoria}', '{$etiquetas}', '{$unidadmedida}', '{$proveedor}', '{$fabricante}', '{$maximo}', '{$minimo}', '{$descripcion}', '{$dias_vencimiento}', '{$servicio}', '{$numeroserie}', '{$ingrediente}', '1'";
$query .=");";
$query .="SELECT LAST_INSERT_ID();";


if($db->query($query)){
$session->msg('s',"Producto agregado exitosamente. Realizar configuracion de costos" . LAST_INSERT_ID());
redirect('precio_producto.php', false);
} else {
$session->msg('d',' Lo siento, registro falló.');
redirect('informacion_producto.php', false);
}
} else{
$session->msg("d", $errors);
redirect('informacion_producto.php',false);
}
}
?>