子モデルの主キーを親モデルの主キー + 枝番とする
最終更新日: 2022年8月31日
親モデルを「サポート」とし、紐づく子モデルを「サポート履歴」とします。それぞれの主キーは次のようになっています。
親モデル「サポート」の登録画面です。主キー項目「サポート契約ID」をセットします。
親モデルを登録後、子モデル「サポート履歴」を新規登録してみます。
子モデル「サポート履歴」の登録画面です。主キー項目「サポート契約ID」は、紐づく親モデル(の主キー)と同じです。もう一つの主キー「連番」は自動設定のため、登録画面では隠し項目としています。
子モデル「サポート履歴」を登録していくと、連番項目が "1", "2",... と増えていきます。
親モデル「サポート」の項目です。主キーは「サポート契約ID」としています。
子モデル「サポート履歴」の項目です。主キーは「サポート契約ID」と「連番」の複合キーです。さらに「サポート契約ID」は(親モデルへの)外部キーでもあります。
登録時に連番を設定するスクリプトです。
ここでは、自分自身(サポート履歴)の、一方の主キーである「サポート契約ID」で検索した結果リストを入手し、その長さに 1 を加えたものを次の連番の値としています。
このスクリプトの問題は、子モデルを削除したときに長さが減るため、次に割り当てる連番の値が重複する可能性があることです。
あるサポート契約IDに紐づく子モデルに連番 1, 2, 3 が割り当てられた状態で、1番目の子モデルを削除したとします。子モデルの要素数が 3 から 2 になるため、次の連番に 3 を当てようとし、重複エラー(連番3はすでに存在する)になります。
子モデルが削除されない運用であれば、このスクリプトでも問題ありません。
上の問題を解決したのが、次のスクリプトです。連番の降順で取得し、その先頭の値(もっとも連番の値が大きい)に 1 を加えたものを次の連番の値としています。
あるサポート契約IDに紐づく子モデルに連番 1, 2, 3 が割り当てられた状態で、1番目の子モデルを削除したとします。最大の連番値は 3 であるため、次の連番は 4 となります。重複エラーにはなりません。
いずれの場合も、欠番はありえます。主キーは一度割り当てると変更できないため、連番の再設定ということはできません。連番が必ず連続している、ということを想定してはなりません。
実行例
モデル 主キー 説明
親モデル「サポート」
サポート契約ID
単一主キー
子モデル「サポート履歴」
サポート契約ID + 連番
複合主キー。サポート契約IDは主キーだが、外部キーでもある。このため親が存在しない子を作成することはできない。
設定方法
親モデル「サポート」
子モデル「サポート履歴」
登録時のスクリプト (1) 子モデルは追加のみで削除がない場合
登録時のスクリプト (2) 子モデルの削除を考慮する
注意