wake-up-neo.com

Holen Sie sich die neue Primärschlüssel-ID des Datensatzes von der mysql insert-Abfrage.

Ok, sagen wir, ich mache eine mysql INSERT in eine meiner Tabellen und die Tabelle hat die Spalte item_id, die auf autoincrement und primary key gesetzt ist.

Wie erhalte ich die Abfrage, um den Wert des neu generierten Primärschlüssels item_id in derselben Abfrage auszugeben?

Momentan führe ich eine zweite Abfrage aus, um die ID abzurufen. Dies scheint jedoch keine gute Praxis zu sein, wenn man bedenkt, dass dies zu einem falschen Ergebnis führen könnte.

Wenn dies nicht möglich ist, was ist die beste Vorgehensweise, um sicherzustellen, dass ich die richtige ID abrufe?

182
Amy Neville

Sie müssen die Funktion LAST_INSERT_ID() verwenden: http://dev.mysql.com/doc/refman/5.0/de/information-functions.html#function_last-insert-id

Z.B:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

Damit erhalten Sie den PRIMARY KEY-Wert der letzten Zeile, die you eingefügt hat:

Die generierte ID wird auf dem Server auf pro Verbindungsbasis verwaltet. Dies bedeutet, dass der von der Funktion an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der für die letzte Anweisung generiert wurde, die die AUTO_INCREMENT-Spalte dieses Clients betrifft.

Der von LAST_INSERT_ID() zurückgegebene Wert ist also pro Benutzer und ist nicht betroffen von anderen Abfragen, die möglicherweise auf dem Server von anderen Benutzern ausgeführt werden.

241
Duncan Lock

IN ACHT NEHMEN !! von "LAST_INSERT_ID ()" wenn versucht wird, diesen Primärschlüsselwert in PHP zurückzugeben.

Ich weiß, dass dieser Thread nicht mit php markiert ist, aber für alle, die auf diese Antwort gestoßen sind und eine MySQL-Einfügungs-ID aus einem PHP -skriptierten Einfügen mit standardmäßigen mysql_query-Aufrufen zurückgeben möchten - es funktioniert nicht und ist ohne Erfassen von SQL-Fehlern nicht offensichtlich.

Das neuere mysqli unterstützt mehrere Abfragen - wobei LAST_INSERT_ID () tatsächlich eine zweite Abfrage vom Original ist.

IMO ein separates SELECT zum Identifizieren des letzten Primärschlüssels ist sicherer als die optionale Funktion mysql_insert_id (), die die aus der vorherigen INSERT-Operation generierte AUTO_INCREMENT-ID zurückgibt. 

Aus der LAST_INSERT_ID() Dokumentation:

Die generierte ID wird auf dem Server auf pro Verbindungsbasis verwaltet.

Das heißt, wenn Sie zwei separate Anforderungen an das Skript gleichzeitig haben, wirken sich diese nicht auf die Funktion LAST_INSERT_ID() der anderen aus (es sei denn, Sie verwenden möglicherweise eine dauerhafte Verbindung).

15
Explosion Pills

Hier, wonach Sie suchen !!!

select LAST_INSERT_ID()

Dies ist die beste Alternative der SCOPE_IDENTITY()-Funktion, die in SQL Server verwendet wird.

Sie müssen auch bedenken, dass dies nur funktioniert, wenn Last_INSERT_ID() ausgelöst wird, gefolgt von Ihrer Insert-Abfrage ..__, dh, die Abfrage gibt die im Schema eingefügte ID zurück. Sie können die zuletzt eingefügte ID einer bestimmten Tabelle nicht abrufen. 

Für weitere Details gehen Sie bitte durch den Link Das Äquivalent der SQLServer-Funktion SCOPE_IDENTITY () in mySQL?

13
PVR

Wenn Sie den Wert vor dem Einfügen einer Zeile benötigen:

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

Sie können dies in einer Einfügung verwenden:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
6
Paulo A. Costa

Sie erhalten diese Parameter in Ihrem Abfrageergebnis:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

Die insertId ist genau das, was Sie brauchen.

(NodeJS-mySql)

2
MESepehr

benutze einfach "$ last_id = mysqli_insert_id ($ conn);"

1
Arnav Singh

Wenn Sie PHP verwenden: Auf einem PDO -Objekt können Sie einfach die lastInsertId -Methode nach Ihrer Einfügung aufrufen.

Ansonsten können Sie mit einer LAST_INSERT_ID den folgenden Wert erhalten: SELECT LAST_INSERT_ID();

0
Olafnyr

Die beste Möglichkeit, das Problem zu lösen, besteht darin, Ihren Code eine zufällige UUID generieren zu lassen und diese UUID dann als Primärschlüssel-ID für Ihre INSERT-Abfrage zu verwenden. Zu diesem Zeitpunkt kennt Ihr Code bereits die "zuletzt eingefügte ID", die Ihre UUID ist, und Sie können sie für andere MySQL-Abfragen wiederverwenden. Die ID ist garantiert eindeutig, damit Sie keine Kollisionen haben. Stellen Sie sicher, dass Sie einen Primärindex für Ihre uuid-Spalten erstellen

0

Wenn Sie in Python pymysql verwenden, können Sie vom Cursor aus cursor.lastrowid verwenden

0
mojoken

ich habe return $this->db->insert_id(); für Codeigniter verwendet

0
Hamza Saeed