それでは、私は自分のテーブルの1つにmysql INSERT
を実行しているとしましょう。テーブルの列item_id
はautoincrement
およびprimary key
に設定されています。
同じクエリ内に新しく生成された主キーitem_id
の値を出力するようにクエリを取得するにはどうすればよいですか?
現在私はIDを取得するために2番目のクエリを実行していますが、これが間違った結果を生むかもしれないことを考えるとこれは良い習慣のようには思えません...
それが不可能な場合は、正しいIDを確実に取得するためのベストプラクティスは何ですか?
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()
によって返される値はユーザごとであり、サーバ上で実行されている可能性のある他のクエリによっては{影響を受けない} 他のユーザからのです。
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()
に影響を与えません(おそらく持続的接続を使用しているのでない限り)。
ここであなたが探しているもの!
select LAST_INSERT_ID()
これがSQL Server
で使用されているSCOPE_IDENTITY()
関数の最善の選択肢です。
また、これはLast_INSERT_ID()
がInsert
クエリに続いて起動された場合にのみ機能することに注意する必要があります。つまり、クエリはスキーマに挿入されたIDを返します。特定のテーブルの最後に挿入されたIDを取得することはできません。
詳細については、リンク を参照してください。mySQLのSQLServer関数SCOPE_IDENTITY()と同等ですか?
行を挿入する前に値が必要な場合:
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'
);
クエリ結果にこれらのパラメータが表示されます。
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId
はまさにあなたが必要としているものです。
(NodeJS-mySql)
単に "$ last_id = mysqli_insert_id($ conn);"を使用してください。
PHPを使用している場合: PDO オブジェクトでは、挿入後に lastInsertId メソッドを呼び出すだけで済みます。
それ以外の場合は LAST_INSERT_ID を使用すると、次のような値を取得できます。SELECT LAST_INSERT_ID();
この問題を解決する最善の方法は、自分のコードにランダムなUUIDを生成させ、このUUIDをINSERTクエリの主キーIDとして使用することです。その時点で、あなたのコードはあなたのUUIDである "最後に挿入されたID"を既に知っています、そしてあなたは他のMySQLクエリでそれを再利用することができます。衝突が発生しないように、IDは一意であることが保証されています。あなたのUUID列のためのプライマリインデックスを必ず作成してください
Pythonでpymysqlを使用している場合は、カーソルからcursor.lastrowidを使用できます。
codeigniterにreturn $this->db->insert_id();
を使用しました