web-dev-qa-db-ja.com

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();

現在のコードではtable1ではなくtable2のLAST INSERT IDが返されるだけなので、間にtable2を挿入してもtable1からIDを取得する方法はありますか。

134
Martin

最後の挿入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;   
224
Julien Hoarau

前のLAST_INSERT_ID()は2番目のテーブルに実際に格納されているので、そこから取得できます。

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();
16
Artem Goutsoul

これにより、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;
13
Ospho

私は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);"

動作しません。最初のコマンドの後、シェルはmysqlからログアウトされ、2番目のコマンドのために再度ログインされるため、変数@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 :-)

3
Holger Seitter

あとで使用するために、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 
    }
0
Angel

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;
0
raiserle