Archive for category MySQL

MySQL:AUTO_INCREMENT 属性

DB(とりあえずMySQL)でテーブルのIDを生成するのに AUTO_INCREMENT 属性を使用します
この AUTO_INCREMENT について

AUTO_INCREMENT 属性をリセット
ALTER TABLE 文でできます

ALTER TABLE dtb_customer AUTO_INCREMENT = 1;

1 にリセットすることはあまりないと思いますが、会員IDや商品IDなど1桁は
ちょっとというときに 10001 にしたりすることが多いかな?

ちなみに AUTO_INCREMENT の値ですが information_schema.TABLES 格納されています。

欠番を取得するにはどうする?
テーブル自体を長いこと運用していると頻出の問題だと思います

MySQL以外でもできるかわかりませんが、以下の方法で欠番が取得できます

SELECT MIN(t1.product_id) + 1 AS product_id FROM dtb_products AS t1
LEFT JOIN dtb_products AS t2 ON t1.product_id + 1 = t2.product_id
WHERE t2.product_id IS NULL
;

最大値まで達したらどうなる?
そもそも最大値まで達することがほぼ無いので、あまり考えたことがなかったのですが
キーカラムの型次第ってことのようです。

バイト 最小値 最大値
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

まさか TINYINT ってことはないので、通常 INT が多いとすれば約21億 UNSIGNED で符号ビット
をはずせば約42億 十分といえば十分?
仮にアクセスログなんかの大量データを扱ったりするなら BIGINT のほうがいいかもしれませんね

MySQLでランダムにデータを取り出すには

いつもは適当に100件ぐらいのデータを取得して、PHPとかでランダムに配列へ格納する
なんてことをやってたんですが、MySQLでできたみたいです。

割と長くMySQLを使っていますが、全然知りませんでした。

SELECT * FROM table WHERE id > 0 ORDER BY rand() LIMIT 100;

レスポンスが遅くならないようにインデックスも含めた方がよさそうです。
う~ん、なんて便利なんだ。(早く気付けよzz)