主キーの指定

最終更新日: 2023年1月18日
R8 | R9

主キーの指定方法

  1. 主キーとして用いる項目の右側にある「詳細」ボタンを押下します。
    詳細定義へ
  2. モデル項目の詳細ダイアログが開きます。
    「詳細 > 主キー > 主キーとして利用する」を有効にします。
    主キーの設定

主キーアイコン

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

鍵アイコンが表示される

単一キー

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

人工キー

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

自然キー

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

複合キー

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

複合キーの詳細WDN

順序

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

対応している型

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

順序を無効にする

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

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

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

順序の実装方法

Oracle, PostgreSQL, SQL Server 2012以降, DB2

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

上記以外のデータベース

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

順序の確定

データベースへ登録される時点で値が確定されます。新規登録画面を開いた段階では順序は定まっていません。そのため、登録の前に順序値を知ることはできません。

順序の初期化

テーブル初期化のタイミングで順序も初期化されます。[詳細...]

ランダムな値

順序を利用した場合、前後のデータの主キー値が予想できるため、アドレスバーに直接、主キー値を入力してデータを閲覧することが可能になります。

これを避けるため、ランダムな値を設定する方法を説明します。

  1. 主キー項目の型を「文字列」とします。
    主キーを文字列型とする
  2. 入力時、読み込み専用とします。(または隠し項目とします。)
    読み込み専用とする
  3. 初期値「登録画面表示時」「登録時」に式を設定します。ランダムな文字列を作成する関数RANDSTRを用います。ここでは引数に "10" を指定し、10文字としています。この値は(利用するデータベースの文字列型のサイズ内で)自由に指定できます。
    初期値にRANDSTR関数を指定する
    登録画面表示時
    RANDSTR(10)
    登録時
    IF(ISEMPTY(Me()), RANDSTR(10), Me())

値が重複する可能性

文字列の乱数は1文字あたり55パターンとなります。(a-z, A-Z, 0-9 のいずれか、ただし i や 0 など除外文字を除く) 10文字だと 55 x 55 x ... 55 となるため重複する可能性は著しく低いです。

それでも重複した場合は Wagby の標準動作で、そのデータの登録に失敗するため、同じ主キー値でデータが格納されることはありません。

仕様・制約

値を変更することはできない

一度保存した主キーの値を変更することはできません。

自動採番利用時における欠番・飛び番

キーに順序を適用した場合に欠番が生じることがあります。具体的には次のような場合です。

  • 何らかの理由で登録処理がデータベース側でエラーとなった。
  • そのデータを削除した。
いくつかのデータベースでは順序をあらかじめメモリに保持しておくことで採番のパフォーマンスを上げるものがあります。このとき、メモリに保持していた番号を消去することがあります。結果として飛び番号が生じます。詳細は、利用するデータベースの仕様を確認してください。

型による制約

  • 日付型項目を主キーとしたとき、日付の書式は "yyyy-MM-dd" のみが許容されます。他の書式は指定できません。