LAST_INSERT_ID()のMySQL
-
27-09-2019 - |
質問
私は、私は非常に簡単でなければならないと考えていることMySQLの質問があります。私は、次のMySQLクエリを実行すると、TABLE1から最後に挿入された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();
私は間を表2に挿入しても、あなたは私がTABLE1からIDを取得する方法だけではなく、テーブル1の表2の最後のINSERT IDを返します。現在のコードを、理解することができたよう?
解決
あなたは変数に最後のインサート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);
またはGET最大の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;
他のヒント
、あなたはそこからそれを得ることができます:
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つの異なるテーブルに行を挿入することができ、あまりにも両方のテーブルへの参照を作成します。
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;
私は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を探している: - )
後でそれを使用してPHPの変数にlast_id_in_table1変数を保存することは可能でしょうか?
これで私は私が必要、このlast_idと別のテーブルに一部のレコードを添付する必要がありlast_idます:
1)INSERTを行うとlast_id_in_table1
を取得しますINSERT into Table1(name) values ("AAA");
SET @last_id_in_table1 = LAST_INSERT_ID();
別のテーブル内の任意のindeterminated行は、2)、インサートに発生last_id_insertでこれらの行を更新します。
$element = array(some ids)
foreach ($element as $e){
UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e
}
:あなたが手順を使用することができます
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;
最後と最後から二番目の場合:
INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user ) );
だけではなく、LAST_INSERT_IDのロドリゴ・ポスト、(のために追加する)クエリで使用すると、TABLE1から選択したMAX(id)を使用することができます;,しかし、あなたが使用する必要があります()、
INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
私たちは、レコードを入力する1人を持っているので、私はすぐに挿入、次の次のクエリを実行します:
$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");
while ($row = $result->fetch_assoc()) {
$id = $row['id'];
}
これは、データベースから最後のIDを取得します。
あなたはあなたのコードに入れて別のクエリ、なしで、あなたのクエリの後、MySQLからの最後の自動増分IDを持っている必要がある場合:
mysql_insert_id();