LAST_INSERT_ID () MySQL


151

Oldukça kolay olması gerektiğini düşündüğüm bir MySQL sorum var. Aşağıdaki MySql sorgusu çalıştırdığınızda LAST INSERTED ID table1 döndürmek gerekir:

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

Şu anki kodun table1 yerine table2'nin LAST INSERT kimliğini döndüreceğini anlayacağınız gibi, table2 arasına eklesem bile table1'den kimliği nasıl alabilirim?

Yanıtlar:


248

Son ekleme kimliğini bir değişkende saklayabilirsiniz:

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

Veya max id frm tablosunu alın1

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;   

5
Teşekkürler! MySQL ile asp.net kullanıyordum ve değişkenlere izin vermek için Bağlantı Dizesine İzin Ver Kullanıcı Değişkenleri = True eklemek için gerekli olarak ilk işe yaramadı.
Martin

114
max iyi bir fikir değildir, çünkü başka bir yerleştiriciyle yarışı kaybedebilirsiniz.
Rob Starling

5
@RobStarling Tamamen katılıyorum, ama birisinin buna kesinlikle ihtiyacı varsa; uygun yalıtım düzeyine sahip bir işlem kullanın.
Aidiakapi

8
2 INSERTS aynı anda veya birbiri ardına gerçekleşirse ne olur?
FosAvance

32
@FosAvance LAST_INSERT_ID () bağlantıya özgü bir ref
Gun2sh

18

Önceki LAST_INSERT_ID () yöntemini ikinci tabloya gerçekten kaydettiğinizden, buradan alabilirsiniz:

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

13

Bu, 2 farklı tabloya bir satır eklemenizi sağlar ve her iki tabloya da bir başvuru oluşturur.

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;

1
Işlem iyi atış.
Kurt Van den Branden

1
Ancak: yalnızca InnoDB'de bulunur.
raiserle

4

Ben bash aynı sorunu vardı ve ben böyle bir şey yapıyorum:

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

hangi iyi çalışır :-) Ama

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

çalışma. Çünkü ilk komuttan sonra, kabuk mysql oturumunu kapatır ve ikinci komut için yeniden oturum açar ve daha sonra @last_insert_id değişkeni artık ayarlanmaz. Benim çözümüm:

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

Belki birisi çözüm bash arıyor :-)


LAST_INSERT_IDyalnızca etkin bağlantı için kullanılabilir. #mysq-komut her komut için bağlayın. mysqlKomutu sunucuya bağlayabilir ve sorgularınızı ekleyebilir veya bir metin dosyası oluşturabilir ve mysqlkomutu txt dosyasından yeniden yönlendirebilirsiniz akamysql [connection option] < txt.file
raiserle

1

Kayıtları giren yalnızca bir kişi var, bu yüzden eklemeyi hemen takip eden aşağıdaki sorguyu yürütüyorum:

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

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

            $id = $row['id'];

}

Bu, veritabanından son kimliği alır.


1
Geçerli bir örnek vermeliydim, bu yüzden kullandığımı kullandım. Eğer C 'de yapmış olsaydım, muhtemelen "herkes C kullanmaz" diye şikayet
ederdim

Muhtemelen en güvenli ve en basit olanı;)
Anjana Silva

1

Hiçbir InnoDB çözümü için: bir prosedür kullanabilirsiniz 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

Ve kullanabilirsiniz ...

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

0

Last_id_in_table1 değişkenini daha sonra kullanmak için bir php değişkenine kaydetmek mümkün olabilir mi?

Bu last_id ile bu last_id ile başka bir tablodaki bazı kayıtları eklemek gerekir, bu yüzden gerekir:

1) Bir INSERT yapın ve last_id_in_table1

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

2) Başka bir tablodaki belirsiz satırlar için, bu satırları ekte oluşturulan last_id_insert ile GÜNCELLEME.

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


-1

Son ve ikinci son için:

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

Bu çözüm, bir işlemin dışında (yani otomatik taahhüt etkin) ve serileştirilebilir seviyenin altında bir işlem yalıtım seviyesine sahip bir işlemin içinde güvenli değildir. Bakınız: en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi

-2

Sadece Rodrigo yazısı için eklemek üzere, sorgudaki LAST_INSERT_ID () yerine SELECT MAX (id) FROM table1; kullanabilirsiniz, ancak (),

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)

Bu çözüm, bir işlemin dışında (yani otomatik taahhüt etkin) ve serileştirilebilir seviyenin altında bir işlem yalıtım seviyesine sahip bir işlemin içinde güvenli değildir. Bakınız: en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi

-9

Mysql'den ihtiyacınız varsa, sorgunuzdan sonra başka bir sorgusu olmayan son otomatik artımlı kimlik kodunuzu girin:

mysql_insert_id();

15
Mysql_ * tavsiye edilmez - bunlar kullanımdan kaldırılmıştır
German Rumm

cletus 106 oy aldı ve mysql_insert_id için cevabı işaretledi : stackoverflow.com/a/897361/153923
jp2code

2
cletus 2009 yılında cevap verdi! mysql, mysqli ve mysqli_insert_id'i kullanmaktan daha iyi bir şekilde kaldırıldı ie2.php.net/mysqli_insert_id
Maciej

2
Luca, Bu eski cevabı silerseniz, itibar puanlarınızın iade edileceğine inanıyorum.
TecBrat

Kullanımdan kaldırılan öneriye başka bir geçerli alternatif PDO :: lastInsertId ( php.net/manual/en/pdo.lastinsertid.php )
w5m
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.