2008-10-03 18 views
8

W mysql, w jaki sposób uzyskać klucz podstawowy używany do operacji wstawiania, gdy jest on automatycznie inkrementowany.Łatwe pytanie mysql dotyczące kluczy podstawowych i wkładki

Zasadniczo chcę, aby zwrócona została nowa wartość autoinkmentacji po zakończeniu instrukcji.

Dzięki!

+0

Wyjaśnienie: Kod ma wstawić następnie last_insert_id. Dwa z tych stwierdzeń wykonać niemal w tym samym czasie i exec order zamienia wkładka nr 1 wkładka # 2 LAST_INSERT_ID # 1 uzupełnia i zwraca identyfikator z wkładką nr 2 LAST_INSERT_ID nr 2 wypełnia i zwraca identyfikator z wkładką # 2 Czy to możliwe? – MPX

Odpowiedz

12

Twój komentarz wyjaśnienie mówi, że jesteś zainteresowany upewniając się, że LAST_INSERT_ID() nie daje zły wynik, jeśli inny współbieżne INSERT dzieje. Zapewniamy, że można bezpiecznie używać LAST_INSERT_ID() niezależnie od innych współbieżnych działań. LAST_INSERT_ID() zwraca tylko najnowszy identyfikator wygenerowany podczas bieżącej sesji.

Można spróbować samemu:

  1. otworzyć dwa okna powłoki, uruchom mysql klienta w każdym i połączyć bazie.
  2. Powłoka 1: WSTAW do tabeli przy użyciu klucza AUTO_INCREMENT .
  3. Powłoka 1: SELECT LAST_INSERT_ID(), zobacz wynik.
  4. Powłoka 2: WSTAW do tej samej tabeli.
  5. Powłoka 2: Wybór LAST_INSERT_ID() zobaczyć wynik różni się od osłony 1.
  6. Shell 1: Wybór LAST_INSERT_ID() znów zobaczyć powtórzeniu poprzedniej wynik.

Jeśli myślisz o tym, jest to jedyny sposób, który ma sens. Wszystkie bazy danych, które obsługują mechanizmy klucza automatycznego inkrementacji, muszą działać w ten sposób. Jeśli wynik zależy od warunków wyścigu, w którym inni klienci mogą jednocześnie WSTAWIĆ, wówczas nie będzie niezawodnego sposobu uzyskania ostatniej wstawionej wartości identyfikacyjnej w bieżącej sesji.

+0

Dzięki! Dokładnie to, czego chciałem. – MPX

+0

@Bill Karwin wiele razy za pomocny wpis. Pytanie: Powiedzmy, że w środowisku z wieloma wątkami ostatnia wartość klucza Auto inc wynosiła 10. Wtedy wątek powłoki 1 nie daje się wstawić iw tym samym momencie wstawia się powłoka 2. Jaki byłby last_insert_id()? 11 lub 12?thx dużo – shadesco

+0

@shadesco: Zależy od twojej wersji MySQL, ale w wersji 5.1 i późniejszych z InnoDB pierwsza sesja zwiększyłaby auto-inc i ta wartość zostałaby utracona. Następnie druga sesja dostanie 12. Zobacz http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html –

0

[wybrać max (primary_key_column_name) z table_name] Ach nie nessecarily. Nie jestem facetem MySQL, ale istnieje specjalny sposób na uzyskanie ostatniego wstawionego identyfikatora dla ostatniej zakończonej akcji, która jest trochę bardziej niezawodna niż ta. Co się stanie, jeśli między pisaniem do tabeli a zapytaniem wystąpi wstawka? Wiem o tym, ponieważ ukłuło mnie to wiele księżyców temu (tak to się stało). Jeśli wszystko inne zawiedzie przeczytać instrukcję: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Powiązane problemy