- ベストアンサー
テーブル修正に関する質問
- テーブルのレコード削除において、そのテーブルの主キーを外部キーに使用している他のテーブルの修正に関して教えて頂きたいです。
- 例えば、テーブルが2つあり、フィールドとして主キーと外部キーがあります。その際、主キーのデータを削除する場合、永久欠番にするのか、新しいデータに割り当てるのかどう対応すれば良いのか質問です。
- 一般に各テーブルの主キーは変更しないものなのか、変更することもありうるのか初心者のため、教えて頂けると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> もし自動採番にしていた場合、後述されてます > >ちゃんと外部キー制約を付けたらRDBMSが削除を受け付けてくれない > ならば、 > 番号の範囲を使い切ってしまっても1番に戻って採番が始まらないということになりますか? シーケンスの設定次第ですが、番号を使い切ってしまったら1番に戻って番号を発行してしまいますので、ダブった番号を登録しようとしてしまいます。 販売員コードが主キーに設定されているなら、ユニーク値しか入れられませんので、INSERTでエラーが出ると思います。 > >外部キーとして参照されている場合、Table-Bに販売員コードが使われている限り > >Table-Aのレコードは削除できなくするのが普通です。 > これは、永久欠番という考え方で宜しいでしょうか? > >Table-Aにステータス情報を持つカラムを用意しておき、販売員が辞めたときはステータスを「退職」にして管理するのが普通です。 > これも永久欠番という考え方で宜しいでしょうか? どちらも永久にDBにデータを残すと言う事です。 別の人に同じ番号を発行しないという意味では永久欠番と言えるでしょう。 Table-Aは販売員のマスターテーブルですからデータを消さないという考え方をします。 DELETEでデータ削除することを「物理削除」と呼びます。 永久にデータが見られなくなるため、Table-Bから参照しようとした時エラーになってしまうので問題があります。 この場合、Table-Aにステータスカラムを用意し在籍中は「1」とし、退職したらデータを「0」にUPDATEすると言った方法を取り、販売員を検索する場合などはステータスが「1」のレコードだけを検索するようにして、プログラム上で見えなくします。 こういった方法を「論理削除」と呼びます。 これによって、データの不整合が発生を防げます。
その他の回答 (3)
- maiko0318
- ベストアンサー率21% (1483/6969)
>1レコードのみを削除した場合はどうなるのでしょうか? 2モードあります。 1)Table-Aから0015番を消したらTable-Bの0015番全てが消える設定。 2)Table-Bに0015番が存在する限り、Table-Aの0015番が消せなくする設定。 です。
お礼
お時間を頂き、大変有難う御座いました。 この様な設定方法もあるんだなと、 今後の参考になりました。 この度は大変有難う御座いました。
- t_ohta
- ベストアンサー率38% (5238/13705)
販売員コードの採番ルールはどうなっていますか? 社員番号など会社が管理する番号なら永久欠番になるでしょうが、シーケンスを使って自動採番する場合、番号の範囲を使い切ってしまったら1番に戻って採番が始まります。(余程頻繁に追加しないとありえませんが) また、外部キーとして参照されている場合、Table-Bに販売員コードが使われている限りTable-Aのレコードは削除できなくするのが普通です。(ちゃんと外部キー制約を付けたらRDBMSが削除を受け付けてくれない) Table-Aにステータス情報を持つカラムを用意しておき、販売員が辞めたときはステータスを「退職」にして管理するのが普通です。
補足
ご回答大変有難う御座います。 初めてですので、自動採番という単語勉強になりました。 現在、自動採番にはしていません。 もし自動採番にしていた場合、後述されてます >ちゃんと外部キー制約を付けたらRDBMSが削除を受け付けてくれない ならば、 番号の範囲を使い切ってしまっても1番に戻って採番が始まらないということになりますか? >外部キーとして参照されている場合、Table-Bに販売員コードが使われている限り >Table-Aのレコードは削除できなくするのが普通です。 これは、永久欠番という考え方で宜しいでしょうか? >Table-Aにステータス情報を持つカラムを用意しておき、販売員が辞めたときはステータスを「退職」にして管理するのが普通です。 これも永久欠番という考え方で宜しいでしょうか?
- maiko0318
- ベストアンサー率21% (1483/6969)
外部キーで連結していれば、Table-Aを消した瞬間にTable-Bも消えてしまいます。 もちろん、何か別の要因でTable-Bが消せない時は、Table-Aも消せません。
補足
ご回答大変有難う御座います。 消せない場合を除いて、 >外部キーで連結していれば、Table-Aを消した瞬間にTable-Bも消えてしまいます。 これはテーブル(Table-A)全部を消した時、連結しているテーブルも消えるということですね。 だとしますと、1レコードのみを削除した場合はどうなるのでしょうか?
お礼
お時間を頂き、大変有難う御座いました。 どうも経験がないため、一般的にどうなのか 考えこんでしまいました。 大変参考になりました。