• 締切済み

テーブル内の一意の値に関しまして

現在、ブランド管理システムの構築に携わらせていただいております。 まだまだ、勉強中の身で気になることだらけです。 MySQL+PHPの組み合わせにて構築を行っております。 1.データベース内に管理番号という項目があり、その項目はデータの呼び出し、更新、他のテーブルとの紐付けに使われ、 この値を書き換えるということはされない項目です。(auto increment、primary keyが設定されております) 現在は、bigint(20)と設定されておりますが、扱える桁数を万が一超えるとなるととても怖いのですが、これ以上桁数を増やすことはできるのでしょうか。 2.1の項目をweb上にて呼び出しを行い、1のような使い方の場合(呼び出した値への加工を行わない)、整数型では扱える範囲(PHP_INT_MAX)を超えている場合になった場合は影響があるのでしょうか。 先輩に聞いてもそう決まっているという回答しか答えていただけません。 詳しい方、是非教えていただけませんでしょうか。

noname#202682
noname#202682
  • PHP
  • 回答数4
  • ありがとう数0

みんなの回答

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

たぶん勘違いをしているか、運用方法が間違いっています マスター系のテーブルで「品目を特定」するのにauto incrementで 発行されるidで管理することはありえません。 auto incrementでプライマリ処理を行うメリットは単に 「レコードを特定」するためのものですから、 品目を特定するidいわゆる品目コードは運用ルールを決める際の 要求定義、要件定義によってルール化される必要があります。 もちろん数値だけで構成されていてもよいですし、 アルファベットやハイフンなどを混ぜてもよいでしょう。 オペレーターの入力しやすさやタイプミスを減らすことを考えれば 固定長の数値のみがベターだと思います。 結論をいえばbigintの出る幕はありません。

  • nerimaok
  • ベストアンサー率34% (1125/3220)
回答No.3

20桁の数字で一秒間に1万レコード生成されるとして、それが消費し尽くさせるまでに どれだけの時間がかかるか計算してみましょう。

  • t_ohta
  • ベストアンサー率38% (5080/13276)
回答No.2

1. bigintで符号なしなら 0 から 18,446,744,073,709,551,615 まで扱えますが、それでも足りないのでしょうか? これ以上は数値として扱えませんので文字列として処理するしかありませんが、その場合DB側で自動採番できませんのでプログラムで工夫する必要があります。 2. DBから取得してきた値は、PHP側で適当な型に当てはめてくれます。 数値として扱えない場合は文字列として保持してくれますので、足し算・引き算等の算術計算をせずHTMLに出力するだけなら問題ありません。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

とりあえず 1. だけ。 たしかに現状のシステムではそのブランドの点数なりなんなりでテーブルの行数が 18446744073709551616 を超えるならば問題でしょう。私はそれは杞憂だと思いますし、たぶん先輩も左記の値を超えるような事態は非現実的と考えているのでしょう。

関連するQ&A

  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • 後からAUTO_INCREMENTの値を1にする方法

    MySQL=4.0.26 phpMyAdmin 2.6.4-pl4を使用しています。 AUTO_INCREMENT(int11)が自動追加されて、数値が70になったとして レコードを削除しても数値が1になりません。 プライマリーキーの関係かなと思いますが、 後からphpMyAdmin上でAUTO_INCREMENTの値を1にする方法、また、自由に数値を変更する方法を教えて頂けないでしょうか。 初期の段階でDBを構築する場合でSQLを実行する場合の AUTO_INCREMENTは解るのですが、 たとえば PRIMARY KEYを(`no`)として TYPE=MyISAM AUTO_INCREMENT=1; として、正常に利用していますが、 DB構築後、レコードが登録された後、phpMyAdmin上で レコードを削除した後またAUTO_INCREMENT=1などにする方法が 解りません。 説明べたで申し訳御座いませんが、 どうぞ宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • auto_incrementの値の取りだし方

    またまたお世話になります。 いつも秒殺質問ばかりしているnak205です。 いまPHPとMySQLでフォームから受付を行い、auto_incrementで発行した受付番号を受付完了画面に表示させるようなものを使っています。 そこで困っているのが、MySQLにデータをINSERTしたあと、どうやって正確にインクリメントされたばかりの受付番号を得ればいいかというところです。 データをINSERTしたあと、受付番号を得るSQLを発行してる間に他の受付が入ってしまえば数字がずれてしまいますよね。INSERTと同時にauto_incrementで出来た数字の値を得る関数がPHPかMySQL側にありますか? 受付番号だけ別テーブルに置いてauto_incrementではなく、PHPで管理したほうが良いんでしょうか?

    • ベストアンサー
    • PHP
  • 桁数の長くないユニークな値の取得

    Apache2 + PHP5 + MySQLという環境でWebアプリを開発しています。 そこでPHPで生成したランダムでユニークな値をデータベースに格納したいのですが、 その際、値の桁数を10文字程度に制限したいのでmd5などを使うと桁数が長くなりすぎてしまい使うことができません。 ただランダムな文字列を格納しておき、もしデータベースに同じデータがあればもう一度やり直すことなども考えましたが、データが多くなると重複の確立が高くなってしまい、あまり気が進みません。 この場合どのようにすれば解決できるのでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • phpMyAdminでPRIMARY KEY AUTO_INCREMENT

    phpMyAdminの操作画面上でPRIMARY KEY AUTO_INCREMENTを設定する方法を教えてください。 SQLを使えばできるのですが、phpMyAdmin上ではAUTO_INCREMENTという項目が見当たりません。 かんたんな内容ですが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENT の値をINSERT前に知りたい

    PHP(PEAR)+MYSQLでWEBアプリを作成しているのですが、AUTO_INCREMENTを設定した値をデータのINSERTを行う前に取得したいのですが、どのようにすればいいのでしょうか?INSERT後であればLAST_INSERT_ID()やmysql_insert_id()で取得できるのは分かっているのですが…。ちなみに現在のテーブル型はInnoDBです。MySQLもしくはPearの命令でお分かりになる方お教えください。よろしくお願いします。

  • データベースで値をインクリメントする方法

    このジャンルでお願いします。 例えばあるカラムをインクリメントする場合に MySQLだと UPDATE mytable SET col=col+1 WHERE id=1; というSQL文でできますが、 一方でプログラム(PHPなど)側で一旦その行を取り出して $id = 1; $col += 1; UPDATE mytable SET col={$col} WHERE id={$id}; というやり方もあると思います。 どちらが良いとか悪い(?)とかあるのでしょうか? 実際にみなさんはどちらのやり方でやっているのでしょうか?またできれば理由もお願いします。 というのも、PHPなどのフレームワークでは値をインクリメントしたい場合は ほとんどが後者のやり方になると思います。 自分的には前者のSQL文でやった方がなんとく良いのでは?と思ってるのですが、 フレームワークなどを使って更新処理を行うと後者のやり方になってしまうので

    • ベストアンサー
    • PHP
  • AUTO_INCREMENTをphpMyadminで設定するのはどうしたらいいでしょうか?

    AUTO_INCREMENTをphpMyadminで設定するのはどうしたらいいでしょうか? いまいちわかりません。AUTO_INCREMENTの値を保存する項目は、"bango"という名前で利用しようとしています。 更新や削除する際に、この値を利用しようと思っています。 ご教授願います。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからデータ取得

    いつもお世話になっております。 以下のようなテーブルがあります。 ---------- CREATE TABLE IF NOT EXISTS `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_number` bigint(20) DEFAULT NULL, `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ---------- CREATE TABLE IF NOT EXISTS `student_upload` ( `student_number` bigint(20) NOT NULL, `upload_id` int(11) NOT NULL ) ---------- データは以下のように登録されています。 students ---------- id|student_number|name 1 |11111     |いちろう 2 |22222     |じろう 3 |33333     |さぶろう student_upload ---------- student_number|upload_id 11111     |1 11111     |2 22222     |1 22222     |2 ---------- student_upload.upload_id=1 のデータを取得したいので 下記のようなSQL文を発行しているのですが、student_upload.upload_id=2 の データも取得されてしまいます。 select * from students s, student_upload up where up.upload_id=1 and up.student_number=s.student_number よろしくご教示お願いいたします。 <環境>  PHP:5.3.5  MySQL:5.0.7

    • ベストアンサー
    • MySQL
  • MySQLでのINDEXの貼り方

    MySQLでのINDEXの貼り方にてご教示いただきたく思います。。 現在、ブログサイトを作っていて、記事ID毎にSNSでシェアされた数を保存する仕組みを作っています。 ストレージエンジン = InnoDB を設定しています。 post_idに同じIDが無い場合はINSERTし、ある場合はUPDATEとなります。 検索をかけるSELECT文の想定は以下の2つだと思っています。 SELECT * FROM tablename WHERE post_id = 1234; SELECT facebook FROM tablename WHERE post_id = 5678 作成したテーブル構造は以下になっています。 名前 | データ型 | 属性 | NULL | デフォルト値 | その他 ID | bigint(20) | UNSIGNED | いいえ | なし | AUTO_INCREMENT post_id | bigint(20) | UNSIGNED | いいえ | 0 facebook | bigint(20) | UNSIGNED | いいえ | 0 twitter | bigint(20) | UNSIGNED | いいえ | 0 googleplus | bigint(20) | UNSIGNED | いいえ | 0 pocket | bigint(20) | UNSIGNED | いいえ | 0 pinterest | bigint(20) | UNSIGNED | いいえ | 0 hatena | bigint(20) | UNSIGNED | いいえ | 0 line | bigint(20) | UNSIGNED | いいえ | 0 total | bigint(20) | UNSIGNED | いいえ | 0 datetime | datetime | | いいえ | 0000-00-00 00:00:00 リレーションは行う予定は無いのですが行うかもしれません。 分からないながらもINDEXを設定 ( 添付画像参照 ) してみました。 ご指導ご教示の程よろしくお願いいたします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう