mysqlに関する質問です。いくつかのフィールドを持ったTABALEを運用していますが、今簡単に

uniquekey data
とします。uniquekeyはauto_incrementです。

例えば
1 data1
2 data2
という風に増えます。

今、
3 data3
を入力し、間違えたのでDELETE FROM TABLE1 WHERE data = 'data3'をしてうまくいったとします。

ところが、次に生成するdataが、
4 data3
となってしまうのです。

理由は、
SELECT uniquekey FROM TABLE1 ORDER BY uniquekey DESC LIMIT 1
として、$data = 'data' . (item['uniquekey'] + 1);のようにしているからです。

これを解消して、data3を削除した後でもちゃんとincrementしたuniquekeyに自動でdataの名称をあわせる方法はありますか?(一度書き込んでからupdateするという手段もありますが・・・)

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/03/15 11:51:07
  • 終了:2011/03/20 06:45:26

ベストアンサー

id:deflation No.2

deflation回答回数1036ベストアンサー獲得回数1262011/03/15 14:28:17

ポイント35pt

質問文からPHPも併用しているものと思われますが、MySQLとPHPのバージョンが分からないので、ここではMySQLバージョン5.5とPHP5.3をご利用になっているものとして回答します。

下記スクリプトを実行してみてください。エラー処理はしていません。


$con = mysql_connect(ホスト名, ユーザー名, パスワード);
mysql_select_db(データベース名, $con);
$sql = "SHOW TABLE STATUS LIKE TABLE;";
$res = mysql_query($sql, $con);
$row = mysql_fetch_array($res);
$next_uq = $row['Auto_increment'];    //次のAutoIncrement値

$data = 'data' . $next_uq;
$sql = "INSERT INTO TABLE (uniquekey, data) VALUES (NULL, '{$data}');";
$res = mysql_query($sql, $con);
mysql_close($con);
id:ReoReo7

ありがとうございます。

こんな方法もあったのですね・・・知りませんでした。

ありがとうございます。

auto_increment無しでいこうと思います。

一度体系的に学ぶ必要があると感じつつも、常に作りたいものありきで考えているので、こうした際に質問が多くなり申し訳ありませんが、助かっています。

2011/03/15 15:12:11

その他の回答(1件)

id:taroe No.1

taroe回答回数1099ベストアンサー獲得回数1322011/03/15 12:22:01

ポイント35pt

uniquekeyだけを別テーブルにもって番号だけ生成させて

こちらのほうは、その番号とdata番号を挿入する形にとる



または、

http://d.hatena.ne.jp/spiritloose/20080327/1206580321

MYSQLのトリガーをつかって、ORACLEのシーケンスのようなものを作成して利用してもよいと思います。

id:ReoReo7

なるほど、別テーブルについては何となく分りました。

betsu_uniquekey status

で、statusが何も無ければ通常どおりinsert、statusにdeleteとか入れてたらもう一度その番号を返すみたいな感じでしょうか。

「MYSQLのトリガーをつかって、ORACLEのシーケンスのようなものを作成」<すみません、理解を超えてしまいましたので1個目の解決策しか分りませんでした。

2011/03/15 12:26:05
id:deflation No.2

deflation回答回数1036ベストアンサー獲得回数1262011/03/15 14:28:17ここでベストアンサー

ポイント35pt

質問文からPHPも併用しているものと思われますが、MySQLとPHPのバージョンが分からないので、ここではMySQLバージョン5.5とPHP5.3をご利用になっているものとして回答します。

下記スクリプトを実行してみてください。エラー処理はしていません。


$con = mysql_connect(ホスト名, ユーザー名, パスワード);
mysql_select_db(データベース名, $con);
$sql = "SHOW TABLE STATUS LIKE TABLE;";
$res = mysql_query($sql, $con);
$row = mysql_fetch_array($res);
$next_uq = $row['Auto_increment'];    //次のAutoIncrement値

$data = 'data' . $next_uq;
$sql = "INSERT INTO TABLE (uniquekey, data) VALUES (NULL, '{$data}');";
$res = mysql_query($sql, $con);
mysql_close($con);
id:ReoReo7

ありがとうございます。

こんな方法もあったのですね・・・知りませんでした。

ありがとうございます。

auto_increment無しでいこうと思います。

一度体系的に学ぶ必要があると感じつつも、常に作りたいものありきで考えているので、こうした際に質問が多くなり申し訳ありませんが、助かっています。

2011/03/15 15:12:11
  • id:ReoReo7
    そもそもauto_incrementを止めたら良いのかもと思えてきました。
  • id:b-wind
    >そもそもauto_incrementを止めたら良いのかもと思えてきました。
    うん、auto_increment の使い方を間違えてる。
    完全な連番じゃ無くて欠番有りで、ユニークキーの生成用カラムと捉えた方が正しい。
  • id:ReoReo7
    ありがとうございます。
    そう捉えなおしたらスッキリしました。
  • id:ReoReo7
    みなさますばらしい回答・ヒントをありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません