新しいデータが頻繁に挿入されるテーブルがあります。テーブルの最後のIDを取得する必要があります。これどうやってするの?
に似ていSELECT MAX(id) FROM tableますか?
INSERTとのクエリの間にテーブルに何かを挿入した場合、最後のIDでMAX(id)はないIDを取得する可能性があることです。
新しいデータが頻繁に挿入されるテーブルがあります。テーブルの最後のIDを取得する必要があります。これどうやってするの?
に似ていSELECT MAX(id) FROM tableますか?
INSERTとのクエリの間にテーブルに何かを挿入した場合、最後のIDでMAX(id)はないIDを取得する可能性があることです。
回答:
PDOを使用している場合は、を使用しますPDO::lastInsertId。
Mysqliを使用している場合は、を使用しますmysqli::$insert_id。
Mysqlをまだ使用している場合:
mysql_*新しいコードでは関数を使用しないでください。それらはもはや保守されておらず、正式に非推奨になっています。赤い箱が見えますか?学ぶプリペアドステートメントの代わりに、および使用 PDOまたは MySQLiをする -この記事は、あなたがどれを決めるのに役立ちます。PDOを選択する場合は、こちらが良いチュートリアルです。
ただし、必要な場合はを使用してくださいmysql_insert_id。
mysql_insert_id 直後あなたmysql_query。もちろん、その間に同じ接続で他のいくつかのクエリを実行する場合、そこに役立つものは何もありません。
PDOどこにでもあるこの偏見とは何ですか?機能比較をもう一度見てみましょう。mysqli低レベルのもので手を汚す必要があるときにそれが勝者であることは明らかです。つまり、PDOを選択したとしても、最終的にはmysqliとにかく使用する必要があります。
現在の接続に挿入された最後のIDを知るための関数があります
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
さらに、コードを2つの異なるセッションで同時に使用すると問題が発生する可能性があるため、maxを使用することはお勧めできません。
その関数はmysql_insert_idと呼ばれます
PDO:
$pdo->lastInsertId();
$mysqli->insert_id;
mysql_*新しいコードでは関数を使用しないでください。それらはもはや保守されておらず、正式に非推奨になっています。赤い箱が見えますか?学ぶプリペアドステートメントの代わりに、および使用 PDOまたは MySQLiをする -この記事は、あなたがどれを決めるのに役立ちます。PDOを選択する場合は、こちらが良いチュートリアルです。
あなたが書いたものは、idそれらがユニークで自動インクリメントされていると仮定して最大の結果をもたらしますが、同時実行性の問題を招くのに問題がないと仮定すると問題ありません。
MySQLをデータベースとして使用しているためLAST_INSERT_ID()、挿入を行った現在の接続でのみ機能する特定の関数があります。
PHPは、そのための特定の関数を提供していますmysql_insert_id。
組み込みのphp関数により、最新の挿入されたIDを取得できます mysql_insert_id();
$id = mysql_insert_id();
あなたも最新のIDを取得します
$id = last_insert_id();
を使用mysql_insert_id()してもかまいませんが、使用に関する特定の注意事項が1つあります。INSERTスクリプトを実行した後で、同じスクリプトセッションで呼び出す必要があります。他の方法で使用すると、正しく機能しません。
注:1つのステートメントで複数の挿入を行う場合、mysqli :: insert_idは正しくありません。
テーブル:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
今あなたがするなら:
insert into xyz (name) values('one'),('two'),('three');
mysqli :: insert_idは3ではなく1になります。
正しい値を取得するには、次のようにします。
mysqli::insert_id + mysqli::affected_rows) - 1
これは文書化されていますが、少しあいまいです。
純粋なMySQL構文を使用して、必要なテーブルの最後のauto_increment IDを取得することを好みます。
php mysql_insert_id()およびmysql last_insert_id()は、最後のトランザクションIDのみを提供します。
スキーマ内の任意のテーブルの最後のauto_incremented ID(最後のトランザクション1だけでなく)が必要な場合は、このクエリを使用できます
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME = 'my_table_name';
それでおしまい。
例を挙げて答えを見ないのは悲しいことです。
Mysqli :: $ insert_idの使用:
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID
PDO :: lastInsertIdの使用:
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
MySQLiトランザクションを使用するとmysqli::$insert_id、0が返されたためにを取得できない場合がありました。特に、ストアドプロシージャを使用している場合は、INSERTs を実行しています。したがって、トランザクションには別の方法があります。
<?php
function getInsertId(mysqli &$instance, $enforceQuery = false){
if(!$enforceQuery)return $instance->insert_id;
$result = $instance->query('SELECT LAST_INSERT_ID();');
if($instance->errno)return false;
list($buffer) = $result->fetch_row();
$result->free();
unset($result);
return $buffer;
}
?>
mysqlは低価格であるため、mysqliを使用します
<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* close connection */
$mysqli->close();
?>
私は試した
mysqli_insert_id($ dbConnectionObj)
これは、現在の接続の最後に挿入されたIDを返すため、接続を適切に管理している場合、これは機能するはずです。少なくとも私のために働いた。
このすべての議論により、最大IDをチェックする理由は、次のIDが何であるかを知ることであると思います(私の最大IDが5の場合、次は5 + 1 = 6になります)。
>>これが理由ではない場合は、私の最高の謝罪
他の誰かがCHECKとINSERTの間に情報を挿入すると、間違ったIDが返されます。
したがって、タイムスタンプまたは他の一意の値を含む可能性のあるハッシュを作成する場合は解決できます。
次に、同じ関数で、空の値とハッシュを使用して情報を挿入できます。AUTO_INCRECEMENTを選択している場合は、IDが作成されます。
次に、同じ関数でハッシュを保持し、同じハッシュでIDを検索できます。そして、mysql UPDATEを使用して空の値の入力を完了することができます。
これにはもう少し接続が含まれますが、それでもそれを行う方法です...
それを解決する幸運。
テーブルにUserID、Emp_ID、...のようなAUTO INCREMENT列がある場合、このクエリを使用して、最後に挿入されたレコードを取得できます 。SELECT * FROM table_name where UserID =(select MAX(UserID)from table_name) PHPコード:
$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
次に、フェッチしたデータを要件として使用できます
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", ***mysql_insert_id()***);