子モデルの主キーを親モデルの主キー + 枝番とする

最終更新日: 2022年8月31日

実行例

親モデルを「サポート」とし、紐づく子モデルを「サポート履歴」とします。それぞれの主キーは次のようになっています。

モデル主キー説明
親モデル「サポート」 サポート契約ID 単一主キー
子モデル「サポート履歴」 サポート契約ID + 連番 複合主キー。サポート契約IDは主キーだが、外部キーでもある。このため親が存在しない子を作成することはできない。

親モデル「サポート」の登録画面です。主キー項目「サポート契約ID」をセットします。

親モデル「サポート」の登録画面

親モデルを登録後、子モデル「サポート履歴」を新規登録してみます。

子モデル「サポート履歴」の登録画面へ遷移する

子モデル「サポート履歴」の登録画面です。主キー項目「サポート契約ID」は、紐づく親モデル(の主キー)と同じです。もう一つの主キー「連番」は自動設定のため、登録画面では隠し項目としています。

子モデル「サポート履歴」の登録画面

子モデル「サポート履歴」を登録していくと、連番項目が "1", "2",... と増えていきます。

連番の値が増加する (1)
連番の値が増加する (2)

設定方法

親モデル「サポート」

親モデル「サポート」の項目です。主キーは「サポート契約ID」としています。

親モデル「サポート」の項目

子モデル「サポート履歴」

子モデル「サポート履歴」の項目です。主キーは「サポート契約ID」と「連番」の複合キーです。さらに「サポート契約ID」は(親モデルへの)外部キーでもあります。

子モデル「サポート履歴」の項目

登録時のスクリプト (1) 子モデルは追加のみで削除がない場合

登録時に連番を設定するスクリプトです。

ここでは、自分自身(サポート履歴)の、一方の主キーである「サポート契約ID」で検索した結果リストを入手し、その長さに 1 を加えたものを次の連番の値としています。

連番を設定するスクリプト(1)

このスクリプトの問題は、子モデルを削除したときに長さが減るため、次に割り当てる連番の値が重複する可能性があることです。

あるサポート契約IDに紐づく子モデルに連番 1, 2, 3 が割り当てられた状態で、1番目の子モデルを削除したとします。子モデルの要素数が 3 から 2 になるため、次の連番に 3 を当てようとし、重複エラー(連番3はすでに存在する)になります。

子モデルが削除されない運用であれば、このスクリプトでも問題ありません。

登録時のスクリプト (2) 子モデルの削除を考慮する

上の問題を解決したのが、次のスクリプトです。連番の降順で取得し、その先頭の値(もっとも連番の値が大きい)に 1 を加えたものを次の連番の値としています。

連番を設定するスクリプト(2)

あるサポート契約IDに紐づく子モデルに連番 1, 2, 3 が割り当てられた状態で、1番目の子モデルを削除したとします。最大の連番値は 3 であるため、次の連番は 4 となります。重複エラーにはなりません。

注意

いずれの場合も、欠番はありえます。主キーは一度割り当てると変更できないため、連番の再設定ということはできません。連番が必ず連続している、ということを想定してはなりません。