プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • データベース
  • 【データベース設計】採番について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【データベース設計】採番について

04.25

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

テーブルには、そのテーブルで必ず一意となるように、主キーを設定するかと思います。

主キーは、基本的には、連番になるように設計することが普通です。

とすると、最後に使用した番号をどこかに記録しておかなければなりません。

主キーの採番はいくつか方法があります。

方法1:採番テーブルを用意する。

その際は、採番用の「採番テーブル」を使うことが普通です。

採番テーブルの例

項目 最終発行番号
ユーザーID 10456
端末ID 14987
備品ID 8765

最大のメリットとしては、全てのDBMSで同じように使えることができる汎用性でしょう。

ただ、やはり少し面倒なのがデメリットになります。

方法2:連番採番機能を使う。

この方法は、設計や実装が非常に楽です。

しかし、全てのDBMSで使えるわけでもありませんし、DBMS製品によって利用方法が異なるので、あまり推奨はされないかもしれません。

機能の中でも、DBMSごとにいくつか方法があります。

列定義を使う方法

DBMS やり方
SQL Server IDENTITY修飾を付与する。
MySQL AUTO_INCREMENT修飾を付与する。
PostgreSQL データ型にSERIAL型を利用する。
SQLite AUTOINCREMENT修飾を付与する。

シーケンスを使う方法

Oracleや、SQL Server等のDBで対応していますが、「シーケンス」という機能を使う方法です。

シーケンスの特徴

  • 常に採番した最新の値を記録しており、シーケンスに指示をすることで、「現在の値」や「最新の値」を自由に取り出すことが可能
  • シーケンスから取り出した値は、即時コミット(複数トランザクションからの利用を想定しているため。)

シーケンスの構文(Oracleの場合)

シーケンスを作成する。

CREATE SEQUENCE シーケンス名;

現在の値を得る。

SELECT シーケンス名.CURRVAL FROM DUAL;

次の値を得る。

SELECT シーケンス名.CURRVAL FROM DUAL;

その他方法

あまり多くはないですが、INTEGER型でかつ主キーがついた項目にNULLを挿入すると自動的に連番を振ってくれるDBもあります。

採番において、あまりおすすめできない方法

例えば、下記のように、MAX関数を使って、最大値を取得して採番するという方法を思いつかれた方もいらっしゃるかもしれません。

SELECT MAX(USER_ID) + 1 AS MAX FROM USER_MASTER;

この方法は、結論から申しますと、おすすめできません。

理由

  • ロックを使わないと複数の人から、同じ番号が採番されてしまう可能性がある点
  • 最後に採番した行が削除されてしまうと、また同じ番号を使うことになる点

大きな理由は一点目の理由でしょう。できるだけ、採番テーブルや、シーケンスを使って採番の仕組みを設計するようにしましょう。

スポンサーリンク
  • 2018 04.25
  • miyabisan2
  • コメントを書く
  • データベース
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.28

    【データベース】トランザクションが競合しないための仕組み(ロック、分離レベル)

  2. 2018 04.29

    【データベース】ロックの基礎知識(デッドロック等も)

  3. 2018 04.29

    【SQL】結合について

  4. 2018 04.26

    【データベース】「A5:SQL Mk-2」を使ってみる。(Oracleの接続設定等)

  5. 2018 04.29

    【データベース設計】ハードウェアのサイジング(容量と性能)を決める。(物理設計)

  6. 2018 04.25

    【データベース設計】基本的な流れ

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【データベース設計】ビューの基本

【データベース設計】バックアップと復旧(リカバリ)方法…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー