2013-01-09 14 views
5

Mam stół, który ma kolumnę z AUTO INCREMENT. Podczas wstawiania nowego wiersza muszę pobrać wartość tej kolumny (potrzebuję wartości nowego wiersza). Dużo czytałem i znalazłem różne rozwiązania, jednym jest użycie SELECT LAST_INSERT_ID(). Słyszałem o tym wiele różnych rzeczy. Czy mogę, czy nie mogę tego użyć? Obawiam się, że inne połączenie może wstawić nowy wiersz, zanim będę mógł zadzwonić pod numer SELECT LAST_INSERT_ID() i dlatego otrzymam nieprawidłowy identyfikator.Używanie MYSQL LAST_INSERT_ID() do pobrania identyfikatora wstawionego wiersza?

Podsumowując, czy można bezpiecznie używać SELECT LAST_INSERT_ID()? Jeśli nie, w jaki sposób mogę pobrać ostatni wstawiony identyfikator w bezpieczny sposób?

+0

ID ostatnio wstawionego powinien powrócić ostatni identyfikator generowany dla bieżącego połączenia. Nie musisz się martwić o inne połączenia. –

+0

Zobacz: http: //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+2

Jeśli korzystasz z automatycznego łączenia połączeń, wykonywanie innego połączenia może odbywać się w innym połączenie. Jeśli go nie masz, jesteś bezpieczny. –

Odpowiedz

12

Nie sądzę, że musisz się martwić o sprawę, o której tu wspomniałeś.

Z dokumentacji MySQL:
identyfikator, który został wygenerowany jest utrzymywana na serwerze na podstawie za połączenia. Oznacza to, że wartość zwracana przez funkcję do danego klienta jest pierwszą wartością wygenerowaną dla najnowszej instrukcji, która ma wpływ na kolumnę AUTO_INCREMENT tego klienta. Na tę wartość nie mogą wpływać inni klienci, nawet jeśli generują własne wartości AUTO_INCREMENT. Takie zachowanie zapewnia, że ​​każdy klient może pobrać własny identyfikator bez obaw o aktywność innych klientów i bez potrzeby blokowania lub transakcji.

Dla szczegółowych informacji, patrz this

Chociaż, ja chciałbym, aby odczytać z innymi, jeśli mają inne zdanie.

0

Jeśli jest bardzo ważne, abyś miał ostatni identyfikator stołu, możesz zablokować stół do zapisu, następnie dokonać SELECT MAX(id) FROM table_name, a następnie odblokować tabelę.

0

Generowany identyfikator dotyczy pojedynczego połączenia, więc nie powinieneś mieć żadnych problemów! This post idzie w bardziej szczegółowy sposób.

0

Tak, według oficjalnej dokumentacji, jest bezpieczne:

identyfikator, który został wygenerowany jest utrzymywana na serwerze na podstawie za połączenia. Oznacza to, że wartość zwracana przez funkcję do danego klienta jest pierwszą wartością AUTO_INCREMENT wygenerowaną dla najnowszej instrukcji wpływającej na kolumnę AUTO_INCREMENT tego klienta. Na tę wartość nie mają wpływu inni klienci, nawet jeśli generują własne wartości AUTO_INCREMENT. Takie zachowanie zapewnia, że ​​każdy klient może pobrać własny identyfikator bez obaw o aktywność innych klientów i bez potrzeby blokowania lub transakcji.

Taken From

: MYSQL Documentation 12.13. Information Functions

0

Jeśli używasz PDO, użyj PDO::lastInsertId.

a jeśli używasz MySQL, użyj mysqli::$insert_id.

i tak jest bezpieczny w użyciu AI Jest stanowisko, które mówi: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

i zamiast używać selec Oświadczenie t bezpośrednio, spróbuj użyć preparedStatement.

Ponadto można użyć Lock

Powiązane problemy