人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mySQL5に関する質問です。
ショップマスタと商品マスタというテーブルがあったとします。
補足に添付したようなテーブル構造だと、商品マスタの削除・挿入を繰り返すうちに6桁を超える可能性があります。
なぜ6桁かというと商品IDをバーコード化するので、6桁以上持つことができません。
PRIMARY KEY を item_id と shop_id にし、 item_id を shop_id ごとに自動連番する方法があれば桁数を押さえられるでしょうが、そのような方法はありますか?
また、マニュアルで item_id を入力する方法は避けたいです。
なにか解決方法はありますか?

phpは5.5です。
よろしくお願いします。


●質問者: wsapp
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

ショップマスタ

CREATE TABLE shop_master (
shop_id MEDIUMINT NOT NULL AUTO_INCREMENT,
user_id MEDIUMINT NOT NULL,
shop_name VARCHAR(256) NOT NULL,
PRIMARY KEY (shop_id),
INDEX idx_userid(user_id),
INDEX idx_name(shop_name)
);

商品マスタ

CREATE TABLE item_master (
item_id INT(6) NOT NULL AUTO_INCREMENT,
shop_id MEDIUMINT NOT NULL,
item_name VARCHAR(256) NOT NULL,
item_price INT(13) NOT NULL,
PRIMARY KEY (item_id),
INDEX idx_shopid(shop_id)
);

1 ● pogpi
●50ポイント

削除した時に、空きIDができるので、新たに登録するときにその空きIDで登録するようにすればできそうですね。バーコード化するなら、商品マスタのプライマリーキーはそのままでいいと思いますよ。


wsappさんのコメント
空きIDを検出して自動でIDを振ることはSQLで可能ですか? 質問にもありますように、 マニュアルで item_id を入力する方法は避けたいです

pogpiさんのコメント
idを昇順にSELECTして、間隔が2以上のとき空きがあるって分かりますね。なければ最大値+1を使えばできます。

wsappさんのコメント
なるほど・・・。 INSERTする前に一度読み込んで、phpでIDを判定してからということですかね。 ショップマスタにレコードが増えるたびに、商品マスタを新たに作ろうか・・・とも思ったのですが、どっちがスマートですか?

pogpiさんのコメント
商品マスタのshop_idは別テーブルにした方がスマートかも知れません。直す必要が出てくる範囲にもよりますね。

wsappさんのコメント
直す必要も考えないといけないでした。 ありがとうございますm(_ _)m

2 ● gizmo5
●50ポイント ベストアンサー

採番用のテーブルを持つのが良いと思います。

CREATE TABLE numbering_table {
item_id INT(6) NOT NULL,
shop_id MEDIUMINT NOT NULL
};

shop_id が存在しなければ、新たにレコードを挿入して item_id は 1 。
shop_id が存在している場合には、item_id をインクリメントして、その item_id を使って item_master のレコードを作成します。
ここはプログラムで制御することになります。

バーコードとして item_id を使うということですから、取り扱いをしなくなった商品でも item_master からレコードを削除するのは運用上の問題が出ると思います。
取り扱わないことを決めてマスタをメンテナンスするタイミングと、実際に店舗から商品を引き上げるタイミングにはタイムラグがあるはずですので。

item_master に、取り扱い中という意味のフラグを設けるか、取扱期間という意味の開始日付・終了日付を持たせる方が良いと思います。


wsappさんのコメント
> item_master に、取り扱い中という意味のフラグを設けるか、取扱期間という意味の開始日付・終了日付を持たせる方が良いと思います。 なるほど・・・そうですね。 早速そのように致します。 確認ですが採番用テーブルを用いるのは、item_masterにshop_idを持たせないということですよね?

gizmo5さんのコメント
>> 確認ですが採番用テーブルを用いるのは、item_masterにshop_idを持たせないということですよね? << いえ、店ごとに item_id を振るわけですから番号が重複しますので shop_id は必要です。 採番テーブルには、店ごとに次に附番するitem_idが分かる情報だけを格納します。 item_master から shop_id で select して max(item_id) でも分かる情報ですが、別テーブルにした方が管理しやすいと思います。

wsappさんのコメント
なるほど、ありがとうございましたm(_ _)m
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ