LAST_INSERT_ID()MySQL

时间:2010-10-01 09:36:19

标签: mysql insert last-insert-id

我有一个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?

13 个答案:

答案 0 :(得分:223)

您可以将最后一个插入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);    

或者获取max id frm table1

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;   

答案 1 :(得分:15)

由于您实际上已将之前的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();

答案 2 :(得分:13)

这使您可以在两个不同的表中插入一行,并创建对两个表的引用。

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;

答案 3 :(得分:2)

我在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: - )

答案 4 :(得分:1)

在触发器 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*/ 并在其他情况下进行测试。 对于多次使用,我可以编写一个函数。很简单。

答案 5 :(得分:0)

可以将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)对于另一个表中的任何不确定的行,使用insert中生成的last_id_insert更新这些行。

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

答案 6 :(得分:0)

对于没有InnoDB解决方案的用户:可以使用一个过程 don't forgot to set the 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;

答案 7 :(得分:0)

代替此LAST_INSERT_ID() 尝试使用此

mysqli_insert_id(connection)

答案 8 :(得分:0)

我们也可以使用 $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;
    }

答案 9 :(得分:-1)

最后和最后一个:

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

答案 10 :(得分:-1)

只是为了添加罗德里戈帖子,而不是查询中的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)

答案 11 :(得分:-1)

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

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

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

            $id = $row['id'];

}

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

答案 12 :(得分:-9)

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

mysql_insert_id();