データベースのテーブルを設計する時に出て来る外部キーについての質問です。
「達人に学ぶDB設計指南書」という本を読んでいるのですが、外部キーの変更に関してわからないところがあります。
社員テーブルには社員ID、社員名、年齢、部署の4つのカラムがあります。
そして、部署列が外部キーであり、部署テーブルの部署列を参照しています。
部署列は開発、人事、営業、総務の4つのレコードを持っています。
このような状況の中で、
「部署テーブルはいわば社員テーブルの「親」に当たる存在であるため、「子」の状態を気にすることなく変更することが可能です。これは人間の親子関係と同じです。子は親が存在しないと存在できませんが、子のいない親は存在しうる、ということです。」
という説明があります。
さらに、次のような記述がありました。
「それでは、親である部署テーブルのレコードが変更されたり削除されたりした場合は、子の社員テーブルはどのような影響を受けるでしょうか?
これについては、社員テーブルを作成する際に、要件に応じて動作を選ぶことが可能です。例えば、部署テーブルの開発レコードが削除された場合、社員テーブルの加藤さんや田島さんは、「親がいない子」になってしまいます。こうした「親のいない子」も合わせて削除するか、それとも削除SQLをエラーにするかを選択可能です。このあわせて削除する動作をカスケードと呼びます。
更新の場合も同じで、「親がいない子」のデータを合わせて変更するか、更新SQLをエラーにするかを選択可能です。
ただし、一番良いのはこうした厄介な問題を考えないようにテーブルを操作することです。つまり、常に子のテーブルを先に削除なり変更して、後から親のテーブルを更新していれば、こうした問題は起きないのです。」
最後の部分について質問です。
先に子のテーブルをを変更して、後から親のテーブルを変更すれば良いとありますが、例えば上のような状況で「開発」というレコードを「開発研究」と変更したいとします。
この定石に従えば、先に社員テーブルの部署カラムの「開発」レコードを「開発研究」と名前を変えればいいわけですが、外部キーの参照整合性制約によりこれはできないと思うのですが、可能なのでしょうか?
親の部署テーブルの4つのカラムに「開発研究」は存在しないのに、社員テーブルの方で「開発研究」をレコードとして用いることが可能なのでしょうか?
回答お願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。