Ok, powiedzmy, że robię mysql INSERT
w jednej z moich tabel, a tabela ma kolumnę item_id
ustawioną na autoincrement
i primary key
.
Jak uzyskać zapytanie, aby wyświetlało wartość nowo wygenerowanego klucza podstawowego item_id
w tym samym zapytaniu?
Obecnie uruchamiam drugie zapytanie w celu odzyskania identyfikatora, ale nie wydaje się to dobrą praktyką, ponieważ może to spowodować niewłaściwy wynik ...
Jeśli nie jest to możliwe, jaka jest najlepsza praktyka, aby upewnić się, że odzyskam prawidłowy identyfikator?
mysql
insert
key
auto-increment
Amy Neville
źródło
źródło
INSERT
zapytania; jak myślisz, dlaczego może to dać zły wynik?Odpowiedzi:
Musisz użyć
LAST_INSERT_ID()
funkcji: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-idNa przykład:
To cię z powrotem na
PRIMARY KEY
wartość ostatniego wiersza, który jesteś w brzmieniu:Tak więc wartość zwracana przez
LAST_INSERT_ID()
jest na użytkownika i nie ma na nią wpływu inne zapytania, które mogą być uruchomione na serwerze od innych użytkowników .źródło
PRIMARY KEY
wartość ostatniego wiersza, który jesteś wstawiony, bo to na połączenie - każde połączenie z serwerem będzie utrzymywać swój własny stosunek do tego. Zaktualizowałem odpowiedź, aby to wyjaśnić.UWAGA! z „LAST_INSERT_ID ()”, jeśli próbujesz zwrócić tę wartość klucza podstawowego w PHP.
Wiem, że ten wątek nie jest oznaczony jako php, ale dla każdego, kto natknął się na tę odpowiedź, chcąc zwrócić identyfikator wstawki MySQL ze wstawki skryptowej PHP przy użyciu standardowych wywołań mysql_query - nie zadziała i nie będzie oczywisty bez przechwytywania błędów SQL.
Nowsze mysqli obsługuje wiele zapytań - które LAST_INSERT_ID () faktycznie jest drugim zapytaniem z oryginału.
IMO osobny WYBÓR, aby zidentyfikować ostatni klucz podstawowy, jest bezpieczniejszy niż opcjonalna funkcja mysql_insert_id () zwracająca identyfikator AUTO_INCREMENT wygenerowany z poprzedniej operacji WSTAWIANIA.
źródło
LAST_INSERT_ID
jest funkcją MySQL dla każdego połączenia. Jeśli zapytasz o ostatni identyfikator wstawiania, możliwe jest, że oddzielne połączenie wykona zapis i będziesz mieć zły identyfikator.mysql_insert_id()
działa również dla poszczególnych połączeń, ale ma również dziwne zachowanie, jak widać tutaj stackoverflow.com/a/897374/1305910 w komentarzu Cliffordlife - nieważne, że wszyscy powinniśmy używaćmysqli
Z
LAST_INSERT_ID()
dokumentacji:To znaczy, jeśli masz dwa oddzielne żądania do skryptu jednocześnie, nie będą one wpływać na siebie nawzajem
LAST_INSERT_ID()
(chyba że używasz trwałego połączenia).źródło
Oto czego szukasz !!!
Jest to najlepsza alternatywa
SCOPE_IDENTITY()
funkcji używanej wSQL Server
.Musisz również pamiętać, że zadziała to tylko wtedy, gdy
Last_INSERT_ID()
zostaniesz zwolniony poInsert
zapytaniu. Oznacza to, że zapytanie zwraca identyfikator wstawiony do schematu. Nie można uzyskać ostatniego wstawionego identyfikatora konkretnej tabeli.Aby uzyskać więcej informacji, proszę przejść przez link Odpowiednik funkcji SQLServer SCOPE_IDENTITY () w mySQL?
źródło
Jeśli potrzebujesz wartości przed wstawieniem wiersza:
Możesz użyć tego we wstawce:
źródło
Otrzymasz następujące parametry w wyniku zapytania:
insertId
Jest dokładnie to, czego potrzebujesz.(NodeJS-mySql)
źródło
Jeśli w Pythonie używasz pymysql, z kursora możesz użyć kursor.strowid
źródło
wystarczy użyć „$ last_id = mysqli_insert_id ($ conn);”
źródło
Jeśli używasz PHP: Na obiekcie PDO możesz po prostu wstawić metodę lastInsertId po wstawieniu.
W przeciwnym razie za pomocą LAST_INSERT_ID możesz uzyskać następującą wartość:
SELECT LAST_INSERT_ID();
źródło
użyłem
return $this->db->insert_id();
Codeigniterźródło
Chcę tylko podzielić się moim podejściem do tego w PHP, niektórzy z was mogą uznać, że nie jest to skuteczny sposób, ale jest to 100 lepiej niż inne dostępne opcje.
wygeneruj losowy klucz i wstaw go do tabeli, tworząc nowy wiersz. następnie możesz użyć tego klucza, aby pobrać klucz podstawowy. użyj aktualizacji, aby dodać dane i robić inne rzeczy.
w ten sposób pomaga zabezpieczyć wiersz i mieć prawidłowy klucz podstawowy.
Naprawdę nie polecam tego, chyba że nie masz innych opcji.
źródło