外部キーと複合キー (1) 親子の関係
最終更新日: 2022年7月4日
想定するモデル関係を図に示します。子モデルBは、モデルAの主キー値がとりうる値の範囲(定義域)と、連番(順序値)の組み合わせとします。
用意するモデルは二つです。
主キーを数値型項目としています。
親モデルAの主キー項目をモデル参照(検索)型で紐付けます。これを MODELA_PKEY とします。さらに子モデルBの順序値をもった項目 MODELB_PKEY を用意します。
MODELA_PKEY 項目はモデル参照(検索)としています。モデル参照の実体は、モデルAの主キー値が格納されます。
さらに、この MODELA_PKEY 項目は外部キーの設定も同時に行います。これによってモデルBの新規作成時、モデルAの主キー値を引き継ぐ動作を実現します。
MODELB_PKEY 項目も主キーとします。これで MODELA_PKEY, MODELB_PKEY の組み合わせによる複合主キーとなります。
主キーに複合キーを使用したとき、順序に利用できるのはいずれか一つの項目のみとなります。複数の主キー項目で順序を使う設定はできません。
モデルAの主キー項目をモデル参照項目とすることで、参照連動を使うことができます。
参照連動は、連動元項目がモデル参照項目となっている必要があります。(文字列、数値、日付といった項目を連動元項目とすることはできません。)
モデルAのデータを2件、用意した例です。
Wagbyでは外部キーの設定をすることで、親モデルの詳細画面に、子モデルの新規登録ボタンが自動的に用意されます。
モデルBの新規登録画面には、親であるモデルAの主キーが自動的にセットされます。参照連動も同時に機能します。
モデルBに関するデータを入力し、作成します。MODELB_PKEY 項目(順序値)が設定されていることがわかります。
モデルBの更新画面では、二つの主キー項目はいずれも読み込み専用となっています。Wagbyでは主キー項目は更新できないよう制御されます。
モデルBのコピー登録画面では、親モデルの主キー値が引き継がれます。
モデルAの詳細画面には、自身に紐づく子モデル(モデルB)の一覧が表示されます。ここでモデルBに含まれるモデルAの主キー項目(図の「モデルAの主キーを自身のキーとする」項目)は表示上はモデルAの「名前」となっていますが、実体はモデルAの主キー値です。
このサンプルモデルから生成されたモデルAのテーブル定義は次のとおりです。
モデルBのテーブル定義は次のとおりです。モデル参照項目 MODELA_PKEY は、モデルAの主キー値が格納されます。
Wagbyが生成するDDL (create table文) は primary key 制約は付与されますが、foreign key 制約は付与されません。アプリケーションのユーザ操作画面では常に親子関係が成立するように値が自動セットされますが、制約をはずれた値を登録した場合でもデータベースのエラーにはなりません。
データベースの参照制約を有効にしたい場合、別途 alter table 命令を発行してください。
設定方法
モデルA
モデルB
項目名
項目ID
型
外部キー
その他
モデルAの主キー
MODELA_PKEY
モデル参照(検索)
モデルAの「モデルAの主キー」
-
モデルBの主キー
MODELB_PKEY
数値
-
順序値とする。
注意
参照連動項目を用意する
参照連動の仕組み
動作例
テーブル定義
create table "MODELA" (
"MODELA_PKEY" integer not null,
"NAME" varchar(255),
"MEMO" varchar(255),
primary key ("MODELA_PKEY")
);
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 制約は用意されない