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?

Author: Amy Neville, 2013-06-14

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.

 217
Author: Duncan Lock,
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.

 15
Author: Martin Sansone - MiOEE,
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).

 13
Author: Explosion Pills,
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?

 13
Author: PVR,
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'
);
 6
Author: Paulo A. Costa,
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)

 1
Author: MESepehr,
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); "

 0
Author: Arnav Singh,
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