LAST_INSERT_ID () MySQL

151

Saya punya pertanyaan MySQL yang menurut saya harus cukup mudah. Saya perlu mengembalikan ID TERAKHIR TERAKHIR dari table1 ketika saya menjalankan permintaan MySql berikut:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

Seperti yang Anda mengerti kode saat ini hanya akan mengembalikan ID INSERT TERAKHIR dari table2 bukan table1, bagaimana saya bisa mendapatkan id dari table1 bahkan jika saya memasukkan ke table2 antara?

Martin
sumber

Jawaban:

248

Anda bisa menyimpan id sisipan terakhir dalam sebuah variabel:

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

Atau dapatkan 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;   
Julien Hoarau
sumber
5
Terima kasih! Saya tidak membuatnya bekerja lebih dulu karena saya menggunakan asp.net dengan MySQL dan perlu menambahkan Izinkan Variabel Pengguna = Benar ke String Koneksi untuk mengizinkan variabel.
Martin
114
max bukan ide yang baik, karena Anda bisa kalah dalam balapan dengan inserter lain.
Rob Starling
5
@RobStarling, saya sepenuhnya setuju, tetapi jika seseorang benar-benar membutuhkannya; gunakan transaksi dengan tingkat isolasi yang tepat.
Aidiakapi
8
bagaimana jika 2 INSERTS bahagia pada saat yang sama atau satu sebelum yang lain?
FosAvance
32
@FosAvance LAST_INSERT_ID () adalah koneksi tertentu ref
Momin Al Aziz
18

Karena Anda benar-benar menyimpan LAST_INSERT_ID () sebelumnya ke tabel kedua, Anda bisa mendapatkannya dari sana:

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

Ini memungkinkan Anda untuk memasukkan baris ke 2 tabel yang berbeda dan membuat referensi ke kedua tabel juga.

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;
Ospho
sumber
1
Tembakan bagus pada transaksi.
Kurt Van den Branden
1
Tetapi: hanya tersedia di InnoDB.
raiserle
4

Saya memiliki masalah yang sama di bash dan saya melakukan sesuatu seperti ini:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"

yang berfungsi dengan baik :-) Tapi

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

tidak bekerja Karena setelah perintah pertama, shell akan keluar dari mysql dan login lagi untuk perintah kedua, dan kemudian variabel @last_insert_id tidak disetel lagi. Solusi saya adalah:

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});"

Mungkin seseorang mencari solusi bash :-)

Eugen Spinne
sumber
LAST_INSERT_IDhanya tersedia untuk koneksi aktif. #mysq-perintah terhubung untuk setiap perintah. Anda dapat terhubung dengan mysqlperintah ke server dan menyisipkan kueri Anda, atau Anda dapat membuat file teks dan Anda mysqlperintah dengan mengarahkan dari file txt aliasmysql [connection option] < txt.file
raiserle
1

Kami hanya memiliki satu orang yang memasukkan catatan, jadi saya menjalankan permintaan berikut segera setelah memasukkan:

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

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

            $id = $row['id'];

}

Ini mengambil id terakhir dari database.

sspence65
sumber
1
Saya harus memberikan contoh yang valid, jadi saya menggunakan yang saya gunakan. Jika saya melakukannya di C, Anda mungkin akan mengeluh "tidak semua orang menggunakan C" ....
sspence65
Mungkin yang paling aman dan paling sederhana dari semuanya;)
Anjana Silva
1

Tanpa solusi InnoDB: Anda dapat menggunakan prosedur 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

Dan Anda bisa menggunakannya ...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;
raiserle
sumber
0

Apakah mungkin untuk menyimpan variabel last_id_in_table1 ke dalam variabel php untuk menggunakannya nanti?

Dengan last_id ini saya perlu melampirkan beberapa catatan di tabel lain dengan last_id ini, jadi saya perlu:

1) Lakukan INSERT dan dapatkan last_id_in_table1

INSERT into Table1(name) values ("AAA"); 
SET @last_id_in_table1 = LAST_INSERT_ID();

2) Untuk setiap baris yang tidak ditentukan di tabel lain, MEMPERBARUI baris-baris ini dengan last_id_insert yang dibuat di sisipan.

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

Alih-alih ini LAST_INSERT_ID() coba gunakan yang ini

mysqli_insert_id(connection)
Sambit Kumar Dalai
sumber
-1

Untuk yang terakhir dan yang terakhir:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );
pengguna2541471
sumber
Solusi ini tidak aman di luar transaksi (mis. Autocommit diaktifkan) dan di dalam transaksi dengan tingkat isolasi transaksi di bawah serializable. Lihat: en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi
-2

Hanya untuk menambahkan untuk posting Rodrigo, alih-alih LAST_INSERT_ID () dalam permintaan Anda dapat menggunakan SELECT MAX (id) FROM table1 ;, tetapi Anda harus menggunakan (),

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
Pavlen
sumber
Solusi ini tidak aman di luar transaksi (mis. Autocommit diaktifkan) dan di dalam transaksi dengan tingkat isolasi transaksi di bawah serializable. Lihat: en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi
-9

Jika Anda perlu memiliki dari mysql, setelah permintaan Anda, id penambahan otomatis terakhir tanpa permintaan lain, masukkan kode Anda:

mysql_insert_id();
Luca Perico
sumber
15
Jangan rekomendasikan mysql_ * - itu sudah tidak digunakan lagi
Rumm Jerman
cletus mendapat 106 upvotes dan jawaban yang ditandai untuk mysql_insert_id di sini: stackoverflow.com/a/897361/153923
jp2code
2
cletus menjawabnya di tahun 2009! mysql sudah ditinggalkan lebih baik untuk menggunakan mysqli dan mysqli_insert_id ie2.php.net/mysqli_insert_id
Maciej Paprocki
2
Luca, Jika Anda akan menghapus jawaban yang sudah usang ini, saya yakin poin reputasi Anda akan dikembalikan.
TecBrat
Alternatif lain yang valid untuk saran usang adalah PDO :: lastInsertId ( php.net/manual/en/pdo.lastinsertid.php )
w5m