web-dev-qa-db-ja.com

MySQLの挿入クエリから新しいレコードの主キーIDを取得しますか?

それでは、私は自分のテーブルの1つにmysql INSERTを実行しているとしましょう。テーブルの列item_idautoincrementおよびprimary keyに設定されています。

同じクエリ内に新しく生成された主キーitem_idの値を出力するようにクエリを取得するにはどうすればよいですか?

現在私はIDを取得するために2番目のクエリを実行していますが、これが間違った結果を生むかもしれないことを考えるとこれは良い習慣のようには思えません...

それが不可能な場合は、正しいIDを確実に取得するためのベストプラクティスは何ですか?

194
Amy Neville

LAST_INSERT_ID()関数を使用する必要があります。 http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

例えば:

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

これにより、あなたが挿入した最後の行のPRIMARY KEY値が返されます。

生成されたIDは接続ごとでサーバーに保持されます。つまり、関数から特定のクライアントに返される値は、AUTO_INCREMENTカラムそのクライアントによるに影響する最新のステートメントに対して生成された最初のAUTO_INCREMENT値です。

そのため、LAST_INSERT_ID()によって返される値はユーザごとであり、サーバ上で実行されている可能性のある他のクエリによっては{影響を受けない} 他のユーザからのです。

259
Duncan Lock

BEWARE !! PHP内でこの主キー値を返そうとしている場合は、 "LAST_INSERT_ID()"の値です。

私はこのスレッドがphpタグ付けされていないことを知っていますが、標準のmysql_query呼び出しを使用してPHPスクリプト挿入からMySQL挿入IDを返すことを探しているエラー.

新しいmysqliは複数のクエリをサポートします - 実際にはLAST_INSERT_ID()は元のクエリから2番目のクエリです。

最後の主キーを識別するための別のSELECTは、前回のINSERT操作で生成されたAUTO_INCREMENT IDを返すオプションのmysql_insert_id()関数よりも安全です。

LAST_INSERT_ID()のドキュメントから:

生成されたIDは、接続ごとにサーバーで管理されます

つまり、スクリプトに対して2つの別々の要求が同時にある場合、それらは互いのLAST_INSERT_ID()に影響を与えません(おそらく持続的接続を使用しているのでない限り)。

15
Explosion Pills

ここであなたが探しているもの!

select LAST_INSERT_ID()

これがSQL Serverで使用されているSCOPE_IDENTITY()関数の最善の選択肢です。

また、これはLast_INSERT_ID()Insertクエリに続いて起動された場合にのみ機能することに注意する必要があります。つまり、クエリはスキーマに挿入されたIDを返します。特定のテーブルの最後に挿入されたIDを取得することはできません。

詳細については、リンク を参照してください。mySQLのSQLServer関数SCOPE_IDENTITY()と同等ですか?

14
PVR

行を挿入する前に値が必要な場合:

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

これをインサートとして使うことができます。

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

クエリ結果にこれらのパラメータが表示されます。

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

insertIdはまさにあなたが必要としているものです。

(NodeJS-mySql)

2
MESepehr

単に "$ last_id = mysqli_insert_id($ conn);"を使用してください。

1
Arnav Singh

PHPを使用している場合: PDO オブジェクトでは、挿入後に lastInsertId メソッドを呼び出すだけで済みます。

それ以外の場合は LAST_INSERT_ID を使用すると、次のような値を取得できます。SELECT LAST_INSERT_ID();

0
Olafnyr

この問題を解決する最善の方法は、自分のコードにランダムなUUIDを生成させ、このUUIDをINSERTクエリの主キーIDとして使用することです。その時点で、あなたのコードはあなたのUUIDである "最後に挿入されたID"を既に知っています、そしてあなたは他のMySQLクエリでそれを再利用することができます。衝突が発生しないように、IDは一意であることが保証されています。あなたのUUID列のためのプライマリインデックスを必ず作成してください

0

Pythonでpymysqlを使用している場合は、カーソルからcursor.lastrowidを使用できます。

0
mojoken

codeigniterにreturn $this->db->insert_id();を使用しました

0
Hamza Saeed