2010-10-01 7 views
102

Mam pytanie MySQL, które moim zdaniem musi być dość łatwe. Muszę wrócić ostatni zapisany identyfikator z tabela1 kiedy uruchomić następujące MySql zapytanie:LAST_INSERT_ID() MySQL

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

Jak można zrozumieć aktualny kod będzie po prostu zwrócenie ostatniej INSERT identyfikator Table2 zamiast tabela1, w jaki sposób można uzyskać id z table1, nawet jeśli wstawię do table2 między?

Odpowiedz

178

Można przechowywać ID ostatnio wstawionego w zmiennej:

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

Albo uzyskać max id frm tabela1

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; 
+4

Dzięki! Nie udało mi się go uruchomić po raz pierwszy, ponieważ korzystałem z asp.net z MySQL i musiałem dodać zmienne Allow User Variables = True do ciągu połączenia, aby umożliwić zmienne. – Martin

+82

max nie jest dobrym pomysłem, ponieważ możesz stracić wyścig z innym wprowadzającym. –

+2

@RobStarling Całkowicie się zgadzam, ale na wypadek, gdyby ktoś tego potrzebował; użyj transakcji z odpowiednim poziomem izolacji. – Aidiakapi

10

Dzięki temu można wstawić wiersz do 2 różnych tabel i tworzy odniesienie do obu tabel.

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

Dobry strzał w transakcji. –

-9

Jeśli trzeba mieć z mysql, po zapytaniu, ostatni autoinkrementowalny id bez innego zapytania, umieścić w kodzie:

mysql_insert_id(); 
+15

Nie polecam mysql_ * - te są przestarzałe –

+0

[cletus] (http://stackoverflow.com/users/18393/cletus) dostały 106 przegranych i zaznaczoną odpowiedź dla ** mysql_insert_id ** tutaj: http: // stackoverflow. com/a/897361/153923 – jp2code

+2

cletus odpowiedz na to w 2009! mysql jest przestarzały, lepiej używać mysqli i mysqli_insert_id http://ie2.php.net/mysqli_insert_id –

14

skoro faktycznie przechowywane poprzednią LAST_INSERT_ID() w drugiej tabeli, można go pobrać stąd:

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

przez ostatni i przedostatni:

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

To rozwiązanie nie jest bezpieczne poza transakcją (np. Włączone automatyczne zatwierdzanie) i wewnątrz transakcji z poziomem izolacji transakcji poniżej serializowalnym. Zobacz: https://en.wikipedia.org/wiki/Isolation_(database_systems) – snorbi

-1

Wystarczy dodać Rodrigo post, zamiast LAST_INSERT_ID() w zapytaniu można użyć SELECT MAX (id) FROM tabela1 ;, ale trzeba użyć(),

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

To rozwiązanie nie jest bezpieczne poza transakcją (tj. Autocommit włączone) i wewnątrz transakcji z poziomem izolacji transakcji poniżej serializowalnym. Zobacz: https://en.wikipedia.org/wiki/Isolation_(database_systems) – snorbi

-2

Mamy tylko jedna osoba wchodząca rekordów, więc wykonuję następujące zapytanie bezpośrednio po wstawieniu:

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

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

      $id = $row['id']; 

} 

Powoduje pobranie ostatniego identyfikatora z bazy danych.

+1

Musiałem podać ważny przykład, więc użyłem tego, którego używam. Gdybym zrobił to w C, prawdopodobnie narzekałbyś "nie każdy używa C" .... – sspence65

0

Byłoby możliwe zapisanie zmiennej last_id_in_table1 w zmiennej php, aby użyć jej później?

Z tego last_id muszę dołączyć kilka rekordów w innej tabeli z tego last_id, więc muszę:

1) Czy INSERT i uzyskać last_id_in_table1

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

2) dla dowolnej indeterminated rzędach w innej tabeli, UPDATING te wiersze z last_id_insert generowane we insert.

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

Miałem ten sam problem w bash i robię coś takiego:

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

który działa dobrze :-) Ale

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

nie działają.Ponieważ po pierwszym poleceniu powłoka zostanie wylogowana z mysql i zalogowana ponownie dla drugiej komendy, a następnie zmienna @last_insert_id nie jest już ustawiona. Moje rozwiązanie to:

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

Może ktoś szuka rozwiązania jest bash :-)

Powiązane problemy