我有一个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?
答案 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();