質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

2回答

11504閲覧

MySQLでのユニークIDの採番方法

yonosuke

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2017/05/09 03:56

###前提・実現したいこと
MySQLでのユニークIDの採番方法
より良いやり方はないですか?
お手数ですがご示唆下さい。

###現在やっている方法

MySQLで一意な値を採番しています。
MySQLではシーケンスがないので、シーケンステーブルを作成し
その値をインクリメントし採番することで、一意な値を取得するようにしています。
問題なく、うまく行っています。

###懸念点
上記の場合、複数セッションから同じ値を取得できないように、別に行ロック用のテーブルを作成して、
採番前にfor update文を用いてリードロックしています。
no waitがないので、ロックが解除されるまで待つことになるのですが、
セッション数が急激に増加した場合に、待ち時間が長くなるのではといつも懸念しています。

なおOracleなどで、リードロックしたい場合は
for update no waitを用いて、他でロックしている状況をすぐに検知しエラーとなるようにしています。

###他の方法
リードロックせずに、採番用のテーブルに更新日を設けて、インクリメントする時に更新日をキーに
更新し、更新日が変わっていた場合は再度採番と言うやり方はあるのですが、それも煩雑なので、
現在のところ上記の行ロック用のテーブルを用いた方法で行っています。

###シーケンステーブル例

CREATE TABLE seq_xxxxx ( id bigint unsigned DEFAULT 0 NOT NULL COMMENT '一意な値の採番用', PRIMARY KEY (id) ) COMMENT = 'シーケンステーブル';

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ユニークさえ確保できればいいのであれば、
auto_incrementしたカラムを用意しておけばいいのでは?

またbigintなデータを保持する気があるのでしたら
作成日時+ミリ秒のデータを保持するという手もあるかと

投稿2017/05/09 04:04

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/09 04:16

多分なんか要件が隠れているんでしょうね^^;
yambejp

2017/05/09 04:35

たしかに、きっと何か目的があるのでしょうね それを提示してもらえれば対策のしようもあるかと思いますう
haru666

2017/05/09 04:41 編集

少し不快感を与える表現かと思われたので削除
haru666

2017/05/09 04:38

と思ったけど、OracleのCREATE SEQUENCEは多機能…なので、そういう意味かもしれないですね。AUTO_INCREMENTはテーブルの付加列ですし、劣化ですから。
yonosuke

2017/05/09 05:10

ご回答ありがとうございます。 すいません。 採番した値を、例えばユーザIDのようなかたちで、ユニークなIDとして他で使用したいのです。 その時に複数のセッションから同じ値を取得できないようにしたいのです。 今の方法より、良い方法がないのかと思い、質問させていただいた次第です。
maisumakun

2017/05/09 05:21

AUTO_INCREMENTでも、(プライマリキーは衝突しませんから)INSERT後にlast_insert_idを見ればユニーク値がとれます。複数サーバから同時INSERTしようとした場合も、適宜番号を飛ばしてくれるので(連番は保証されませんが)ユニーク性では問題ありません。
guest

0

UUID ですかね?
UUID()

使ったことがないので、あまり詳しいことは分かりませんが^^;

後、こっちも合わせてみると良さ気です。

MySQL InnoDBの介在する大規模サービスにおけるID生成戦略について

こっちもあまり詳しくありませんw

投稿2017/05/09 05:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問