MySQLから取得したデータテーブルauto_increment値(基数)の方法
問題は、1行のデータを挿入する前に、生成するidを知りたいということです.例えば、アップロードしたファイルの名前を付けたいです.IDを事前に取得しないとファイル名が分からないので、挿入時にファイルパスをデータベースに保存することはできません.idを事前に取得する必要がない場合は、挿入後にmysqlを呼び出すことができます.insert_id()またはselect last_の実行insert_id()は、下を見る必要はありません.せっかちな同級生の世話をするために、まず答えをあげます.
ここでtablenameはデータテーブル名に変換され、$idはauto_increment列の次の値.この方法しか使えないphpのmysqlinsert_id()、MySQLのselect last_insert_id()、select @@last_insert_id、select @@insert_id、select@@identityはすべてだめです.なぜか知りたいなら下を見続けます.
手動で指定しない限り、まずはっきりさせなければなりません.auto_incrementは値を繰り返す必要はありません.たとえば、テーブルを新規作成し、3行のデータを挿入します.id値は1、2、3で、問題ありません.もしあなたが2、3の2行を削除して、それから1行のデータを挿入したら、そのid値はいくらですか?2ですか.4です!ある学生は「違う」と思っているかもしれません.MySQLリファレンスマニュアルに書いてあるじゃないですか.
インデックスに組み込まれたAUTO_INCREMENT列にNULL値(推奨)または0を挿入した場合、この列は次のシーケンスの値に設定されます.通常はvalue+1です.ここでvalueは現在テーブルにあるカラムの最大値です.
そうですが、MySQLリファレンスマニュアルにも書いてあります.
削除した行にAUTO_が含まれている場合INCREMENT列の最大値は、BDテーブルに再使用されますが、MyISAMテーブルやInnoDBテーブルには使用されません.
BDBって何?調べたら、BerkeleyDBです.私のMySQL 5.0.51 bを見て、このエンジンが全然見つかりませんでした.私から見れば、この2つは根本的に矛盾しているが、実験の結果は前者が間違っていて後者が正しい.だから次のような書き方はだめです.
select
max(id)
+
1
from tablename
ではphpのmysql_insert_id()関数は?phpマニュアルには次のように書かれています.
前回のクエリでAUTO_が生成されなかった場合INCREMENTの値はmysql_insert_id()は0を返します.
では、1行のデータを削除したばかりなのに、今また挿入したい場合はどうすればいいのでしょうか.挿入前に値を取得するには使用できないことは明らかです.ではMySQLのlast_insert_id()関数は?MySQLリファレンスマニュアルでは、
LAST_INSERT_ID() LAST_INSERT_ID(expr)
最後のINSERTまたはUPDATEのAUTOへの問い合わせを自動的に返します.INCREMENT列に設定された最初の発生値.
では、初めてデータを挿入する前に?データサーバが再起動したら?明らかに使えない.そして不思議なことに、私が実験した結果、この関数はずっと0を返していたので、どうしたのか分かりません.グローバル変数も試してみましたが、どれも0で、本当に神様です.以上、show table statusのみは何ら制限されず、いつでもデータテーブルのauto_を得ることができます.incerement値.テーブル・ステータスをクエリーするデータベース管理文であり、データ・エンジン、作成時間、文字セットの整理(校正)など、多くの有用な情報も返されます.文法はselectにネストすることをサポートしていないので、すべて調べるしかありません.これで前後に挿入する必要はありません!
原文:http://blog.chinaunix.net/uid-20525206-id-1935733.html
PS
$result = mysql_query("SHOW TABLE STATUS LIKE 'events'");
$values = mysql_fetch_array($result);
$auto_increment_value = $values['Auto_increment'];
$result = mysql_query("show table status like 'tablename'");
$id = mysql_result($result, 0,'Auto_increment');
ここでtablenameはデータテーブル名に変換され、$idはauto_increment列の次の値.この方法しか使えないphpのmysqlinsert_id()、MySQLのselect last_insert_id()、select @@last_insert_id、select @@insert_id、select@@identityはすべてだめです.なぜか知りたいなら下を見続けます.
手動で指定しない限り、まずはっきりさせなければなりません.auto_incrementは値を繰り返す必要はありません.たとえば、テーブルを新規作成し、3行のデータを挿入します.id値は1、2、3で、問題ありません.もしあなたが2、3の2行を削除して、それから1行のデータを挿入したら、そのid値はいくらですか?2ですか.4です!ある学生は「違う」と思っているかもしれません.MySQLリファレンスマニュアルに書いてあるじゃないですか.
インデックスに組み込まれたAUTO_INCREMENT列にNULL値(推奨)または0を挿入した場合、この列は次のシーケンスの値に設定されます.通常はvalue+1です.ここでvalueは現在テーブルにあるカラムの最大値です.
そうですが、MySQLリファレンスマニュアルにも書いてあります.
削除した行にAUTO_が含まれている場合INCREMENT列の最大値は、BDテーブルに再使用されますが、MyISAMテーブルやInnoDBテーブルには使用されません.
BDBって何?調べたら、BerkeleyDBです.私のMySQL 5.0.51 bを見て、このエンジンが全然見つかりませんでした.私から見れば、この2つは根本的に矛盾しているが、実験の結果は前者が間違っていて後者が正しい.だから次のような書き方はだめです.
select
max(id)
+
1
from tablename
ではphpのmysql_insert_id()関数は?phpマニュアルには次のように書かれています.
前回のクエリでAUTO_が生成されなかった場合INCREMENTの値はmysql_insert_id()は0を返します.
では、1行のデータを削除したばかりなのに、今また挿入したい場合はどうすればいいのでしょうか.挿入前に値を取得するには使用できないことは明らかです.ではMySQLのlast_insert_id()関数は?MySQLリファレンスマニュアルでは、
LAST_INSERT_ID() LAST_INSERT_ID(expr)
最後のINSERTまたはUPDATEのAUTOへの問い合わせを自動的に返します.INCREMENT列に設定された最初の発生値.
では、初めてデータを挿入する前に?データサーバが再起動したら?明らかに使えない.そして不思議なことに、私が実験した結果、この関数はずっと0を返していたので、どうしたのか分かりません.グローバル変数も試してみましたが、どれも0で、本当に神様です.以上、show table statusのみは何ら制限されず、いつでもデータテーブルのauto_を得ることができます.incerement値.テーブル・ステータスをクエリーするデータベース管理文であり、データ・エンジン、作成時間、文字セットの整理(校正)など、多くの有用な情報も返されます.文法はselectにネストすることをサポートしていないので、すべて調べるしかありません.これで前後に挿入する必要はありません!
原文:http://blog.chinaunix.net/uid-20525206-id-1935733.html
PS
$result = mysql_query("SHOW TABLE STATUS LIKE 'events'");
$values = mysql_fetch_array($result);
$auto_increment_value = $values['Auto_increment'];