Uzyskać nowy rekord klucz podstawowy ID z MySQL insert query?
Ok, powiedzmy, że robię mysql INSERT
w jednej z moich tabel i tabela ma kolumnę item_id
, która jest ustawiona na autoincrement
i primary key
.
Jak sprawić, by zapytanie wyświetliło wartość nowo wygenerowanego klucza podstawowego item_id
w tym samym zapytaniu?
Obecnie uruchamiam drugie zapytanie, aby pobrać identyfikator, ale nie wydaje się to dobrą praktyką, biorąc pod uwagę, że może to przynieść zły wynik...
Jeśli nie jest to możliwe, to jaka jest najlepsza praktyka upewnić się, że odzyskam poprawny identyfikator?
7 answers
Musisz użyć funkcji LAST_INSERT_ID()
: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Eg:
INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();
To zwróci PRIMARY KEY
wartość ostatniego wiersza, który wstawiłeś :
Wygenerowany identyfikator jest przechowywany na serwerze na zasadzie dla połączenia. Oznacza to, że wartość zwracana przez funkcję do danego klienta jest pierwszą wartością AUTO_INCREMENT wygenerowaną dla większości ostatnie oświadczenie wpływające na kolumnę AUTO_INCREMENT przez tego klienta.
Więc nie ma to wpływu na inne zapytania, które mogą być uruchomione na serwerze od innych użytkowników.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 19:38:45
Uważaj !! "LAST_INSERT_ID ()" jeśli próbuje zwrócić tę wartość klucza głównego w PHP.
Wiem, że ten wątek nie jest oznaczony php, ale dla każdego, kto natknął się na tę odpowiedź, aby zwrócić ID Insert MySQL ze skryptowego insert PHP przy użyciu standardowych wywołań mysql_query - to nie działa i nie jest oczywiste bez przechwytywania błędów SQL.
Nowszy mysqli obsługuje wiele zapytań-które LAST_INSERT_ID () w rzeczywistości jest drugim zapytaniem z oryginał.
IMO oddzielny wybór do identyfikacji ostatniego klucza podstawowego jest bezpieczniejszy niż opcjonalna funkcja mysql_insert_id () zwracająca identyfikator AUTO_INCREMENT wygenerowany z poprzedniej operacji INSERT.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 21:56:47
Z LAST_INSERT_ID()
dokumentacji:
Wygenerowany identyfikator jest przechowywany na serwerze na zasadzie per-connection basis
Oznacza to, że 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).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 16:27:23
Tutaj to, czego szukasz !!!
select LAST_INSERT_ID()
Jest to najlepsza alternatywa dla SCOPE_IDENTITY()
funkcji używanej w SQL Server
.
Należy również pamiętać, że będzie to działać tylko wtedy, gdy {[3] } zostanie wywołane przez twoje zapytanie Insert
.
Czyli zapytanie zwraca id wstawione do schematu. Nie można uzyskać ostatnio wstawionego identyfikatora konkretnej tabeli.
Po Więcej Szczegółów proszę przejść przez link odpowiednik funkcji SQLServer SCOPE_IDENTITY () w mySQL?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:24
Jeśli potrzebujesz wartości przed wstawieniem wiersza:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
Możesz użyć tego we wkładce:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( concat (convert ( now() , char), ' ', getAutoincrementalNextval ('document') ) ),
'Title',
'Body'
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 09:42:18
Otrzymasz te parametry w wyniku zapytania:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId
jest dokładnie tym, czego potrzebujesz.
(NodeJS-mySql)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 04:58:42
Po prostu użyj "$last_id = mysqli_insert_id ($conn); "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-15 09:38:36