2011-01-10 2 views
2

私はしばらくの間、基本的なMySQLを行ってきましたが、それ以上のことはありません。私はテーブルに新しい行を挿入するときに、行が私に戻ってくるか、何かを返す方法があるのだろうかと思っています。基本的に私は自律フィールドを持つテーブルを持っており、できるだけ素早く素早く自律番号を取得したいと考えています。行を返すことができない場合は、最高のオートナンズについて2番目のクエリを実行するだけで足りるものがありますか?テーブルが他のプロセスやユーザーによって更新された可能性がありますが、これは正しい番号ではありませんか?現在、ちょうど私がちょうど入力した内容の行を検索するだけで、それでも問題が発生しているようです。INSERTコマンドで生成された行をMySQLに返す方法はありますか?

私はPHP 5.1とMySQL 5.0.45を使用しています。

ありがとうございました。

+0

あなたはLAST_INSERT_ID()http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id –

+4

NBを探しています:あなたが」 PHPでmysql_insert_id関数を使用してください。** ** PHP内から "LAST_INSERT_ID()" SQLクエリを発行しようとしません**。 –

+1

@middaparka:ポイントを気にする人は、彼の質問に答えません。良い質問に感謝し、知識に興味がある人はポイントを気にしません。 –

答えて

4

は、この機能を試してみてください:mysql_insert_id

それは

+1

これは二次質問に答えます。「他のプロセスやユーザーによってテーブルが更新された可能性はありませんが、これは正しい数字ではありませんか?」 –

+1

@aaaa bbbb - PHPのmysql_insert_idはクエリと同じ接続で呼び出されるため、常にそのクエリからIDを返します。つまり、他のユーザーのアクティビティには影響されません。 –

+0

ありがとう!そして@middaparkaに感謝します。 PDOを使用しているので、PDO :: lastInsertIdを使用する必要があります。それは私に他の問題を引き起こすかどうか誰もが知っていますか? –

5

あなたは現在の接続の範囲で作品ですLAST_INSERT_ID()使用することができ、最後のクエリで生成されたIDを返します。

生成されたIDは、接続ごとにサーバーに保持されます。つまり、関数が指定したクライアントに返す値は、そのクライアントがAUTO_INCREMENT列に影響を与える最新の文に対して生成された最初のAUTO_INCREMENT値です。この値は、たとえ自身のAUTO_INCREMENT値を生成したとしても、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、ロックやトランザクションを必要とせずに、他のクライアントのアクティビティを意識することなく、独自のIDを取得できます。

詳細情報here

+2

PHP内から「LAST_INSERT_ID()」SQLクエリを発行しないようにmiddaparkaのコメントにどのように応答しますか?私は組み込みのPHP関数mysql_insert_idを使うと思います。 –

+0

LAST_INSERT_ID()は、スクリプト内のどこでもSQLレベルで使用されるわけではありません。 PHPからの価値を得ようとしているのであれば、middaparkaのアドバイスに従うことをお勧めします。 –

+0

ありがとうSergei!私はPHPのバージョンで行くつもりですが、私はこれについても知っていただければ幸いです。 –

0

mysql_insert_idを使用するには、大丈夫ですが、本当に競合状態を避けたい場合は、挿入したばかりの値を挿入した後でselectを実行してください。これらの値が一意でない場合は、以前に計算されたタイムスタンプも挿入します。 http://www.php.net/manual/en/function.mysql-insert-id.php#95584

<?php 
$date = date('U'); 
$db->query("INSERT INTO TABLE table VALUES('', 'a', 'b', 'c', 'd', '". $date ."'"); 
$res = $db->query("SELECT id FROM table WHERE a_col = 'a' AND b_col = 'b' AND c_col = 'c' AND d_col = 'd' AND temp_id = '".$date."'"); 
?> 
+2

コードをコピーするソースにリンクするのは害ではありません... http://www.php.net/manual/en/function.mysql-insert-id.php#95584 – nickf

+0

これは完全に不要です。 PHPのmysql_insert_idは接続ベースなので、実行中のPHPスクリプトが別のSQLクエリを発行しない限り、以前の挿入IDはそのまま残ります。 –

+0

@middaparke:自動インクリメントフィールドを使用していないときや、1つのコマンドで複数の行を挿入しているときは? – Sergi

関連する問題