2009-08-16 17 views
23

Podczas wstawiania danych do tabeli, która ma automatycznie zwiększany PK, muszę uzyskać ten klucz do użycia w innej instrukcji. Jak wiele pytań pokazuje na SO można to zrobić w PHP przy użyciu mysql_insert_id().Pobieranie ostatnich wstawionych identyfikatorów dla wielu wierszy

Jednak zgrupowałem moje wkładki, więc wstawiam więcej niż jeden wiersz na raz. Zrobiłem to, ponieważ odgadłem, że prawdopodobnie wystąpi problem z wydajnością, proszę, jeśli się mylę. W każdym razie, o ile mi wiadomo, tylkozwraca ostatni identyfikator, kiedy potrzebuję identyfikatorów dla wszystkich wstawionych wierszy.

Chyba w tym przypadku mogłem:

  1. zrobić kilka prostych matematycznych obliczyć wszystkie identyfikatory za pomocą mysql_insert_id() i liczbę wierszy I weszły. Ale czy jest to zagwarantowane konsekwentnie poprawne?

  2. Stosować oświadczenia wielokrotnego wstawiania, po jednym dla każdego wiersza

  3. Generowanie moje identyfikatory przed i nie ma sensu automatycznego.

Jestem pewien, że to musi być klasyczny problem, więc zastanawiam się, jakie są najbardziej powszechne i wskazane podejścia.

Odpowiedz

2

Istnieje kilka metod, które użyję, gdybym mnie:

Po pierwsze, istnieje pole CreateDate z niewykonania zobowiązania CURRENT_TIMESTAMP metody. Zasadniczo wybierasz CURRENT_TIMESTAMP, aby uzyskać datę, uruchomić wstawkę, a następnie select id from table where CreateDate > $mytimestamp.

Po drugie, można utworzyć wyzwalacz w tabeli, aby rejestrować after insert i umieścić nowe identyfikatory w małej tabeli kontroli. Jednak skróć tabelę przed sprawdzeniem tych identyfikatorów. Użyłbym tej metody, jeśli twój stół zawiera miliony wierszy.

+0

Opcja 'podejście CURRENT_TIMESTAMP' wydaje się trochę niebezpieczne dla mnie. Co jeśli ty i ktoś inny piszesz przy tym samym stole w tym samym czasie (ten sam znacznik czasu)? – tonix

32

Wywołanie last_insert_id() daje ID pierwszego wiersza wstawionego do ostatniej partii. Wszystkie inne wstawione mają gwarancję kolejności.

Jeśli nie robisz czegoś bardzo dziwnego, pozwala to na łatwe wyliczenie identyfikatora każdego rzędu.

Faktycznie zachowanie zmienia się w 5.1, w zależności od ustawienia parametru trybu inkrementacji automatycznej innodb; to nie powinno mieć znaczenia. Dopóki nie zmienisz go z domyślnego, zobaczysz oczekiwane zachowanie.

Istnieją przypadkowe przypadki, w których nie dzieje się to, czego się spodziewasz, i nie jest przydatne - na przykład, jeśli wykonujesz OPROGRAMOWANIE NA KLAWISZE NA DUPLIKACJĘ lub WSTAWIJ IGNORE. W takich przypadkach musisz wykonać inne czynności, aby ustalić identyfikatory każdego wiersza.

Ale dla zwykłego wsadu INSERT z wanilią, bez wartości określonych dla kolumny z automatycznym dodawaniem, jest to łatwe.

Pełen opis sposobu auto-increments are handled in innodb is here

+1

Zakładam, że InnoDB, ponieważ większość aplikacji powinna używać InnoDB, jest to najlepszy silnik ogólnego przeznaczenia. – MarkR

+0

W przypadku silników z blokadą na poziomie tabeli (pamięć, myisam itp.) Automatyczne wpisywanie jest banalne, ponieważ nie trzeba się martwić o współbieżność. – MarkR

+0

To jest to, o czym myślałem, "zrób matematykę". Czy chaos jest błędny, mówiąc, że nie ma gwarancji, że będzie sekwencyjny? a może mnie źle zrozumiał – zenna

Powiązane problemy