• ベストアンサー

ユニークIDを連番にする

DB(Mysql)にあるIDを以下の条件をもとに一意に振りたいと考えております。 ・ID:0,1,2のみが(DBに)あれば次はID3を振る ・ID:0,2,3のみが(DBに)あれば次はID1を振る ご存じの方、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ID + 1がIDに存在しない最小値,という考え方をすればできるようです。 ref) HAVING句の力 (1/2):CodeZine http://codezine.jp/article/detail/652?p=1

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

まぁふつうの運用では以下のような感じなんですけどね ・データの削除をせず、フラグで管理する ・仮にデータを削除する場合はauto incrementなどでつけるような連番は  そもそも抜け番号など気にしない ・それでもどうしても連番で表示したいなら、変数でインクリメント処理するとか  ランク処理をいれる SET @renban=0; select *,(@renban:=@renban+1) as renba from テーブル; みたいな感じ(ランク処理はここで例示するにはめんどうなので割愛)

全文を見る
すると、全ての回答が全文表示されます。
  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.2

効率もクソも考えなくてやるとしたら >>・ID:0,1,2のみが(DBに)あれば次はID3を振る >>・ID:0,2,3のみが(DBに)あれば次はID1を振る IDの最大値と、レコード数を取得し、 IDの最大値+1=レコード数 だったら欠番なし。 IDの最大値+1>レコード数 だったら欠番ありだから、補間処理。 補間処理は、ID全部取得しておいて、 0から+1ずつ増やした値と取得しておいたID比較して、 合致しなかった時点でbreakかまして、そこの値を使ってIDを振る。 まぁ、後は、欠番が出る=どっかで削除処理する。 わけだから、削除処理を行った際に、欠番管理テーブルにでも欠番を突っ込んでおいて、 それを取得してくる。ぐらいがパッと思いつくところ。 でも、それだと処理追加箇所が多いし、DBアクセス回数自体は変わらないから 自分なら前者かな。。。 まぁ、IDのチェックするテーブルが、10万レコード、100万レコード。 とかになるものだったら考えちゃうけど-w-

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • primary(unique?) keyでwhereしてupdateできない

    mysql5.0を使っています。 IDという項目のPrimary Key、他は特別な設定をしていない項目が複数あります。これらの項目をupdateで更新する際(IDは更新しません、永久に固定です)、そのままでは当然全部の行がupdateされてしまうので条件指定が必要です。そこで更新対象が一意になるよう、whereを使ってIDを指定しようと思ったのですが、なぜかこれが実行されません。SQL文は以下のような感じです。 update my_db set a="a", b="b", c="c" where id="oshiete";(何も変わらない) 色々やって実験してみたところ、キーが一意になるような設定(Uniqueあるいは自動的にそうなるPrimary)をしているとうまくいきません。設定を外すとうまくいきますが、仕様上どうしてもIDは一意である必要があるのでその設定を外す訳にはいきません。しかしなぜかselect文では問題なく動作します。 select * from my_db where id="oshiete"; なぜこのケースでupdateを実行できないのでしょうか? どなたか解決法をご存知の方、どうかお助けください。 よろしくお願い致します。

  • 検索結果IDの使いまわしについて

    いつもお世話になります。 MySQL+PHPでシステムを構築しております。 PHPのmysql_queryもしくはmysql_db_queryで得た結果IDを使いまわす方法はありませんか? というのも、MySQLへ同じ検索をかける必要がある場合、都度検索するより、一度検索した結果IDを使えれば楽なのですが。。。 実際にやりたい事は、PHPのwhile関数で結果ID分の繰り返し処理を行い、その後、同じ繰り返し処理を行いたいのですが、再度、検索クエリ文をmysql_queryもしくはmysql_db_queryを行わずに利用できる方法があればと考えております。宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • IDが最大値のレコードに項目を追加

    MYSQLで、一度書き込み処理をさせ、 書き込んだIDを取得して加工したsubidを、 テーブルに再接続をしてIDの最大値を取得して、 それを最新のレコードとして追加で項目を書き込もうと思うのですが、 なぜかうまくいきません。 再接続の際に、先程書き込んだレコードを読み出す方法がまずいのでしょうか? どなたかご教授ください。 よろしくお願いいたします。 -----------省略----------- <?php $subid = $nosel . $finish ; $update_id = max(id); $db = mysql_connect("localhost","hogehoge",""); mysql_select_db("hogehogeuser"); $query = "update hogehoge set subid = \"$subid\" where ID = $update_id\""; mysql_query($query); mysql_close($db); ?>

  • SQLServerのID列(自動連番)について

    PHPとSQL Serverでウェブアプリケーションを作っています。 例として、下記のようなテーブルを想定します。 テーブル名 users  user_id [int] ←主キー(IDENTITYプロパティを指定して、1ずつ増える連番)  name [char(10)] IDENTITYにより、INSERT INTO でuser_idの値を指定せずとも、一意のID値が割り振られます。 このINSERT処理は、PHPのmssql_queryでSQL文を発行しているのですが、 この時割り振られたuser_idが何であるかは、どうやって調べればよいのでしょうか。 IDENTITYを利用せず、INSERTする前にSELECT MAX(user_id)を発行して、 最も大きなuser_idを調べ、それを+1してINSERT、とすれば当然user_idは分かりますが、 せっかくIDENTITYの機能があるのに明らかに無駄な処理です。 どなたか分かる方、よろしくお願いします。

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 何故、mysql_insert_id が not a valid になるのでしょうか?  

    MySQLバージョン サーバ5.0.45、 クライアント 3.23.49 Apache2.0.61 (Win32) PHP4.4.7 の環境下で、 名称 member, id int(10) unsigned not null auto_increment、 name, varchar(20) not null, mail varchar(30) not null のテーブルを作りました。          次のスクリプトを書いて <?php session_start(); $name = $_POST["name"]; $mail = $_POST["mail"]; print_r($_POST); $conn = mysql_pconnect("localhost", "ABC", "XYZ") or die("Can't connect"); mysql_select_db("SIMEI", $conn) or die("db error") ; $query = "INSERT INTO member (name, mail) VALUES ('$name','$mail')"; $result = mysql_query($query, $conn); //$oid = 'mysql_insert_id($result)'; //''で括ってみる $oid = mysql_insert_id($result); // ← 11行 $result = mysql_query( "SELECT id FROM member WHERE oid = $oid", $conn); if($result){ print("insert OK");}  echo "Can't insert "; $_SESSION['id'] = mysql_result($result, 0); // ← 14行 mysql_close($conn); ?> これを実行すると、 データはmysql DB に登録されますが、下記のエラーが出て、id を取得できません。 何故でしょうか? どうすれば不具合を解決することができるでしょうか? Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in C:\・・・・\insert.php on line 11 Warning: mysql_result(): supplied argument is not a valid MySQL result resource in C:\・・・・・\insert.php on line 14

    • ベストアンサー
    • MySQL
  • IDとパスワードを認証すコードをかきましたが動きません

    phpの超初心者です、よろしくお願いします。 IDとパスワードを認証すコードをかきましたが動きません。 Formから別に使ったdbにあるIDとパスを見に行くコードでが、 dbにあるIDとパスと同じものを打ち込んでも認証しません、 また別のdbにあるIDとパスを打ち込んでも認証するときがあります。 一体どこが悪いのでしょうか。どこが悪いのかさっぱり分かりません。 よろしくお願いします。 --------------------------------------- <?php $conn = mysql_connect(localhost, "root", ""); //DBにコネクト mysql_select_db('login_test', $conn); //'login_test'をselect mysql_query('SET NAMES utf8'); //defalt $res_init=mysql_query('SELECT * from user'); //userからすべてのdataを取得 while($arr = mysql_fetch_assoc($res_init)){ //結果セットが無くなるまでループ foreach($arr as $k => $v){ echo "フィールド ".$k." の値は ".$v; echo "<br />"; } echo "<br />"; } //formからDATAを取得 $id=$_POST['input_ID']; $pass=$_POST['input_pass']; print("入力したid= ".$id." 入力したpass= ".$pass); //認証check if(auth ($id,$pass,$conn)===true){ print("認証成功"); } else{ print("認証不成功"); } //function function auth ($id,$pass,$conn){ $sql = "SELECT * from user WHERE user_id = $id AND password = '$pass'"; $res = mysql_query($sql, $conn); return $res; } ?> <form action="http://localhost/test/test.php" method="POST"> IDの入力:<input type="text" name="input_ID"><br /><br /> Passの入力:<input type="text" name="input_pass"><br /><br /> <input type="submit" name="delete_submit" value="送信"><br /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • MYSQLを用いた集計について

    MySQLを用いた、クロス集計(?)のデータについてどこを探しても見つからなかったので、投稿します。 DBAとDBB、DBCをLEFT JOINを行って、DBCの複数条件の全てのに適合する、DBBの件数をAのID単位で取得したいと思っています。 <テーブル構成> DB:A ---- id PK B_id FK flag ---- DB:B ---- id PK C_id FK flag ---- DB:B ---- id PK flag ---- そこで色々試行錯誤してみたのですが、良い方法が見つからず、現在は確認を兼ねて、以下の様な形で抽出するリストを構築する所 までは行いました。 --- SELECT *,count(DB_B.id) FROM (DB_A LEFT JOIN DB_B on DB_A.B_id = DB_B.id) JOIN DB_C on DB_B.C_id = DB_C.id WHERE DB_A.flag = 100 AND (DB_C.flag = 1 OR DB_C.flag = 2 OR DB_C.flag = 3) GROUP BY DB_B.id HAVING count(DB_C.id) = 3 --- ここで抽出されるリストをDB_Aのid別に件数を取得するにはどうすればよろしいでしょうか? もちろん、上のコードでは無理だろうと予測はついているのですが、ここから先に進めず…。 ちなみに、環境は以下のとおりです。 MySQL:4.0.27 PHP:4.4.4 ※ちなみに、同じような形式でDB_Dの複合条件、DB_Eの複合条件を掛け合わせていく形もあり得るため、それに準じた方法・知恵をご教授いただけると幸いです。 よろしくお願致します。

  • sqlite3でrowid以外にid必要ですか?

    sqlite3に挑戦中です。 これまでmysqlを使用していました。 sqlite3ですが、rowidというコラム(行番号)が自動的に付加しますね。 当初idとかnoというPRIMARY KEYをつけていたのですが、INSERTができないためidコラムをDrop Columnしました。 でも、抽出するときにrowidでSELECTしようと思ったら、抽出できるわけないですね。できる方法があったら、教えてください。 ↓こんなふうにrowidをセットしようと思ったら見事に空白でした。file= $s .= '<a href =./index.php?mode=check&file=' . $row["rowid"] . '>' . $row["name"] . '</a><br>'; ということはやっぱりid、noというプライマリーキーは必要でしょうか? もちろんnameが一意なので条件設定できますが、スマートでない気がします。 AUTO INCREMENTしてくれないので、一々、値を入れていかないといけないのでしょうか?mysqlだったら、自動的に番号を付加してくれるので、NULLや空白を入れていたのですが。 つまらない質問ですが、確認のためよろしくお願いします。

  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • 大容量HDDから小容量SSDへのデータ移行方法を教えてください。
  • エレコム株式会社の製品を使用しているのですが、HDDスタンド 2ベイ デュプリケーターを利用してクローンすることは可能ですか?
  • 利用端末はディスクトップのWin10です。
回答を見る