LAST_INSERT_ID() MySQL
Posted
技术标签:
【中文标题】LAST_INSERT_ID() MySQL【英文标题】: 【发布时间】:2011-04-19 18:35:57 【问题描述】:我有一个 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?
【问题讨论】:
【参考方案1】:您可以将最后一个插入 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);
或者从 table1 获取最大 id(编辑:警告。请参阅 Rob Starling 的 cmets 中的注释,了解使用最大 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 在 cmets 中指出的那样)
【讨论】:
谢谢!我没有让它首先工作,因为我在 MySQL 中使用 asp.net,需要将 Allow User Variables=True 添加到连接字符串以允许变量。 max 不是一个好主意,因为你可能会输掉与另一个插入器的比赛。 @RobStarling 我完全同意,但万一有人绝对需要它;使用具有适当隔离级别的事务。 如果 2 个 INSERTS 同时或一个在另一个之前发生怎么办? @FosAvance LAST_INSERT_ID() 是特定于连接的ref【参考方案2】:这使您可以将一行插入到 2 个不同的表中,并创建对这两个表的引用。
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;
【讨论】:
交易成功。 但是:仅在 InnoDB 上可用。【参考方案3】:如果你需要从mysql,在你的查询之后,最后一个自动递增的id没有另一个查询,输入你的代码:
mysql_insert_id();
【讨论】:
不推荐 mysql_* - 那些已被弃用 cletus 获得了 106 个赞,并在此处标记了 mysql_insert_id 的答案:***.com/a/897361/153923 cletus 在 2009 年回答了它!不推荐使用 mysql 更好地使用 mysqli 和 mysqli_insert_id ie2.php.net/mysqli_insert_id 卢卡,如果你删除这个过时的答案,我相信你的声望点会被退回。 弃用建议的另一个有效替代方案是 PDO::lastInsertId (php.net/manual/en/pdo.lastinsertid.php)【参考方案4】:由于您实际上将之前的 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();
【讨论】:
【参考方案5】:倒数第二个:
INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user ) );
【讨论】:
此解决方案在事务外部(即启用自动提交)和事务隔离级别低于可序列化的事务内部不安全。见:en.wikipedia.org/wiki/Isolation_(database_systems)【参考方案6】:只是为了添加 Rodrigo 帖子,而不是查询中的 LAST_INSERT_ID(),您可以使用 SELECT MAX(id) FROM table1;,但您必须使用 (),
INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
【讨论】:
此解决方案在事务外部(即启用自动提交)和事务隔离级别低于可序列化的事务内部不安全。见:en.wikipedia.org/wiki/Isolation_(database_systems)【参考方案7】:我们只有一个人输入记录,所以我在插入之后立即执行以下查询:
$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");
while ($row = $result->fetch_assoc())
$id = $row['id'];
这会从数据库中检索最后一个 id。
【讨论】:
我必须给出一个有效的例子,所以我使用了我使用的那个。如果我是在 C 中完成的,你可能会抱怨“不是每个人都使用 C”...... 可能是最安全和最简单的;)【参考方案8】:是否可以将 last_id_in_table1 变量保存到 php 变量中以供以后使用?
有了这个last_id,我需要用这个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
【讨论】:
【参考方案9】:我在 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 的解决方案 :-)
【讨论】:
LAST_INSERT_ID
仅可用于活动连接。 #mysq
-command 连接每个命令。您可以使用 mysql
命令连接到服务器并插入您的查询,或者您可以创建一个文本文件,然后使用 mysql
命令从 txt 文件重定向,也就是 mysql [connection option] < txt.file
【参考方案10】:
对于没有 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;
【讨论】:
【参考方案11】:而不是这个LAST_INSERT_ID()
尝试使用这个
mysqli_insert_id(connection)
【讨论】:
【参考方案12】:在触发器 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*/
并在其他情况下进行测试。
对于多次使用,我可以编写一个函数。这很容易。
【讨论】:
【参考方案13】:我们也可以使用 $conn->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;
【讨论】:
【参考方案14】:我的代码对我不起作用。恢复我上次插入的 id 的任何想法,这是我正在开发的代码,我不太了解
我在查询中有错误,我不知道如何在 $ session-> msg ('s', "产品添加成功。进行成本配置"。LAST_INSERT_ID ()); 行中发送打印p>
已经验证并且数据库的连接和字段是正确的。
<?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);
?>
【讨论】:
嗨@Alexander Suarez,欢迎来到 ***。请问可以用英文吗? 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 我已将语言更改为英语。我希望你能帮我写代码以上是关于LAST_INSERT_ID() MySQL的主要内容,如果未能解决你的问题,请参考以下文章