RDBテーブルカラムの参照操作
参照操作とは
関係データベース(RDB)上で複数のテーブルを生成する時、あるテーブルのカラムを別のテーブルのカラムへの参照という形で定義することができる。これを外部キーと呼ぶ。外部キーの値には、参照先に存在しない値を設定することは許されない。この制約を参照整合性制約と呼ぶ。
しかし、参照先のレコードが絶対更新(削除)できないのは非常に不便である。そこで、参照先レコード更新時に、外部キーにどのようなふるまいをするか規定するための操作が定義されている。それを参照操作と呼ぶ。
例
例えば、商品テーブルと伝票テーブルが存在するとする。
商品テーブル
商品ID | 商品名 | 価格 |
---|---|---|
1 | チョコレート | 200 |
2 | キャラメル | 50 |
3 | キャンディ | 100 |
伝票テーブル
伝票ID | 顧客ID | 商品ID | 個数 |
---|---|---|---|
1 | 001 | 1 | 10 |
2 | 001 | 2 | 20 |
3 | 002 | 1 | 30 |
この時、伝票テーブル上の商品IDは商品テーブル上の商品IDを参照する外部キーとする。
参照整合性制約に従うと、外部キーである伝票テーブル上の商品IDには、商品テーブルに存在しない商品IDがあってはいけないということになる。
しかし、例えばキャラメルに割り当てる商品IDを4にしたい等の場合(めったにないが)、参照整合性を担保するために外部キー側が柔軟に対応する必要がある。このとき、参照操作として設定した操作が適用される。
参照操作の種類
参照操作には、データベース言語標準 SQL:2003で規定された5つの操作がある。
- CASCADE
- RESTRICT
- NO ACTION
- SET NULL
- SET DEFAULT
但し、DBMSによってサポートしていない操作もあるので、マニュアルを読みつつ対応する必要がある。
CASCADE
参照先の値が変更されたら、外部キーの値も変更する。
参照先レコードが削除されたら、削除されたレコードの参照先と同じ値の外部キー値を持つレコードを削除する
RESTRICT
外部キーに同じ値が存在する参照先カラムを持つレコードを削除させない。
NO ACTION
参照先の値が変更・またはレコードが削除されても、外部キーに変更はない。 但し、この変更によって参照整合性制約が破綻する場合、SQL自体が実行されない。
SET NULL
参照先の値が変更もしくは削除された場合、外部キーの値をNULLとする。
SET DEFAULT
参照先の値が変更もしくは削除された場合、外部キーの値をデフォルト値とする。 デフォルト値は参照操作設定時に指定できる。