外部キーと複合キー (1) 親子の関係

最終更新日: 2022年7月4日

設定方法

想定するモデル関係を図に示します。子モデルBは、モデルAの主キー値がとりうる値の範囲(定義域)と、連番(順序値)の組み合わせとします。

モデルの関係

用意するモデルは二つです。

用意する親子モデル

モデルA

主キーを数値型項目としています。

モデルA (親)
モデルA (親) 主キーの設定

モデルB

親モデルAの主キー項目をモデル参照(検索)型で紐付けます。これを MODELA_PKEY とします。さらに子モデルBの順序値をもった項目 MODELB_PKEY を用意します。

項目名 項目ID 外部キー その他
モデルAの主キー MODELA_PKEY モデル参照(検索) モデルAの「モデルAの主キー」 -
モデルBの主キー MODELB_PKEY 数値 - 順序値とする。
モデルB (子)

MODELA_PKEY 項目はモデル参照(検索)としています。モデル参照の実体は、モデルAの主キー値が格納されます。

モデルB (子) モデルAの主キーを参照項目として持つ (1)

さらに、この MODELA_PKEY 項目は外部キーの設定も同時に行います。これによってモデルBの新規作成時、モデルAの主キー値を引き継ぐ動作を実現します。

モデルB (子) モデルAの主キーを参照項目として持つ (2)

MODELB_PKEY 項目も主キーとします。これで MODELA_PKEY, MODELB_PKEY の組み合わせによる複合主キーとなります。

モデルB (子) 順序を用いた主キー

注意

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

参照連動項目を用意する

モデルAの主キー項目をモデル参照項目とすることで、参照連動を使うことができます。

モデルB (子) 参照連動項目 (1)
モデルB (子) 参照連動項目 (2)

参照連動の仕組み

参照連動は、連動元項目がモデル参照項目となっている必要があります。(文字列、数値、日付といった項目を連動元項目とすることはできません。)

動作例

モデルAのデータを2件、用意した例です。

モデルAのデータを用意する

Wagbyでは外部キーの設定をすることで、親モデルの詳細画面に、子モデルの新規登録ボタンが自動的に用意されます。

モデルAの詳細画面にモデルBの新規作成ボタンが用意される

モデルBの新規登録画面には、親であるモデルAの主キーが自動的にセットされます。参照連動も同時に機能します。

モデルBの新規登録画面

モデルBに関するデータを入力し、作成します。MODELB_PKEY 項目(順序値)が設定されていることがわかります。

モデルBの作成(1)
モデルBの作成(2)

モデルBの更新画面では、二つの主キー項目はいずれも読み込み専用となっています。Wagbyでは主キー項目は更新できないよう制御されます。

モデルBの更新画面

モデルBのコピー登録画面では、親モデルの主キー値が引き継がれます。

モデルBのコピー登録画面

モデルAの詳細画面には、自身に紐づく子モデル(モデルB)の一覧が表示されます。ここでモデルBに含まれるモデルAの主キー項目(図の「モデルAの主キーを自身のキーとする」項目)は表示上はモデルAの「名前」となっていますが、実体はモデルAの主キー値です。

モデルAの詳細画面

テーブル定義

このサンプルモデルから生成されたモデルAのテーブル定義は次のとおりです。

create table "MODELA" (
    "MODELA_PKEY" integer not null,
    "NAME" varchar(255),
    "MEMO" varchar(255),
    primary key ("MODELA_PKEY")
);

モデルBのテーブル定義は次のとおりです。モデル参照項目 MODELA_PKEY は、モデルAの主キー値が格納されます。

create table "MODELB" (
    "MODELA_PKEY" integer not null,
    "MODELB_PKEY" integer not null,
    "NAME" varchar(255),
    "MEMO" varchar(255),
    primary key ("MODELA_PKEY", "MODELB_PKEY")
);

foreign key 制約は用意されない

Wagbyが生成するDDL (create table文) は primary key 制約は付与されますが、foreign key 制約は付与されません。アプリケーションのユーザ操作画面では常に親子関係が成立するように値が自動セットされますが、制約をはずれた値を登録した場合でもデータベースのエラーにはなりません。

データベースの参照制約を有効にしたい場合、別途 alter table 命令を発行してください。