サポート > リポジトリ > モデル > 主キーの指定

モデルには必ず1つ以上の主キー項目を用意してください。「主キー」とはデータを一意に識別させるもので、重複のない値のことです。

主キーとして用いる項目の右側にある「詳細」ボタンを押下します。

図1 詳細定義へ

「主キーとして利用する」にチェックが入っている場合、この項目は主キーになります。

図2 主キーの設定

このウィンドウの下部に用意されている「OK」ボタンを押下して(ウィンドウを)閉じます。

主キー指定された項目は、モデル項目一覧で鍵のアイコンが表示されます。

図3 鍵アイコンが表示される

1つの項目だけでデータが一意に識別できるものを「単一キー」といいます。

人工キー

整数型の項目を主キーに指定した場合、データの新規登録時に既存データの主キーと値が重複しないようにシステム側で連番を振ることができます。これを「人工キー(または代理キー)」と呼びます。

自然キー

データの特性を活かした主キーを「自然キー」と呼びます。社員番号や品番といった業務特性上、重複しない値を主キーとして用いる場合です。

複数の項目を組み合わせてデータが一意に識別できるものを「複合キー」といいます。 複数の自然キーを組み合わせる、または自然キーと人工キーを組み合わせるといった方法があります。

複合キーの内部的な表現...

「主キーの詳細」欄で「順序を利用する」にチェックが入っている場合、開始番号からユニークな番号が自動的に割り当てられるようになります。

この「順序を利用する」を無効にすることもできます。この場合、主キーの値は手入力となります。

対応している型

R8.4.0以降

整数(4バイト整数)、8バイト整数、文字列型。

R8.0.0〜R8.3.x

整数(4バイト整数)のみ。

業務ルールを加味した順序の設計

接頭語の付与、ゼロ詰め、任意の書式といった主キーの表現を拡張することができます。詳細...

順序の実装方法

Oracle, PostgreSQL, SQL Server 2012以降, DB2

利用するデータベースが「順序」(Sequence) を提供している場合、Wagby はこれを利用します。

上記以外のデータベース

内蔵データベース (HSQLDB) や MySQL など、順序をもたないデータベースを利用する場合は、Wagbyが内部で "seq" というテーブルを用意します。このテーブルで順序値を管理しています。

順序の初期化

Wagbyが提供するテーブル初期化コマンド (init_db.bat) で、順序を作成するためのSQL (create sequence) を発行します。順序機能を提供しないデータベースを利用している場合、同じくテーブル初期化コマンドで、順序テーブル (seqテーブル) を作成します。ただし内蔵データベース (HSQLDB) 利用時は、ビルド処理でテーブルおよび順序の作成が行われます。

すでに運用中のアプリケーションがあり、そこで順序を初期化したい場合は次の方法のいずれかを行なってください。

  • 現在のテーブルおよび順序を削除するコマンド drop_db.bat を実行し、そののち init_db.bat で初期化する。
  • データベースに対して手動で順序(sequence)をdropする。もしくは順序テーブル(seqテーブル)をdropする。そののちテーブル初期化コマンド init_db.bat を実行する。あるいは手動で順序もしくは順序テーブルを作成する。

順序(自動採番)における欠番・飛び番

主キーに人工キー(代理キー)を適用した場合でも、欠番が生じる場合があります。具体的には次のような場合です。

  • 何らかの理由で登録処理がデータベース側でエラーとなった。
  • そのデータを削除した。

データベースではいくつかの順序をあらかじめメモリに保持しておくことで採番のパフォーマンスを上げるものがありますが、メモリに保持していた番号を消去することがあります。結果として飛び番号が生じます。

データベースの順序を利用しても欠番や飛び番が発生することがあります。詳細は、利用するデータベースの仕様を確認してください。

複合キーの制約

主キーに複合キーを使用したとき、順序に利用できるのはいずれか一つの項目のみとなります。複数の主キー項目で順序を使う設定はできません。

  • 主キーの値を変更することはできません。
  • 「主キーとして利用する」設定がチェックされた場合、必須チェックが自動的に有効かつ変更不可となります。
  • 日付型項目を主キーとしたとき、日付の書式は "yyyy-MM-dd" のみが許容されます。他の書式は指摘できません。
  • 時刻型項目を主キーとしたとき、時刻の書式は "HH:mm:ss" のみが許容されます。他の書式は指摘できません。
  • 日付・時刻型項目を主キーとしたとき、日付・時刻の書式は "yyyy-MM-dd HH:mm:ss" のみが許容されます。他の書式は指摘できません。
  • 複合キーは、チェックボックスを使ったモデル参照および参照連動に未対応です。

モデル参照項目を主キーとする場合の注意点

モデル参照項目を主キーに含める場合、次の制約があります。

  • モデル参照(チェックボックス)を主キーとすることはできません。
  • 参照連動項目を主キーとすることはできません。
  • 複合キーをもったモデルを参照した項目を主キーとした場合、このモデルをさらに別のモデルから参照することはできません。

3つ目の制約について、補足します。図4に示したモデルの関係を例に説明します。ここで model2 の pkey3 項目は model1 を参照するようにしているため、テーブルのカラムは "model1のpkey1", "model1のpkey2", "pkey4" と 3 つが内部的に用意されます。

図4 model1とmodel2の関係

ここで model3 の item1 項目を、model2 を参照するようにします。ところが item1 項目の実際のテーブルのカラムは "model1のpkey1", "model1のpkey2", "model2のpkey4" と 3 つを参照する必要がありますが、参照先に model1 と model2 が混在するようなケースは Wagby で扱うことができません。

図5 model1,model2,model3の関係(動作しない)

この解決のために、model2 の主キーを、model1 の主キーと同じように設定してください。

図6 model2 の主キーの設定

この場合は model3 の item1 項目は正しく model2 を参照することができます。

図7 model1,model2,model3の関係(動作する)

関連するページ