スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)
参照制約を有効にするためには,外部キーによって参照される主キーを被参照表に定義しておく必要があります。定義系SQLのCREATE TABLEで被参照表にPRIMARY KEY(主キー)を指定します。また,検査保留状態を使用するには,pd_check_pendingオペランドにUSEを指定するか,又はオペランドの指定を省略します。
参照表には,FOREIGN KEY(外部キー)を指定し,FOREIGN KEY句中に次の指定をします。
CASCADE,又はRESTRICTを指定した場合の被参照表と参照表の動作について説明します。
CASCADEを指定すると,被参照表の主キーに変更があった場合,外部キーも同じように変更されます。なお,参照表の外部キーに変更がある場合,主キーに変更後の値と同じ値の行があるかどうかをチェックして,参照制約違反エラーになれば外部キーは変更されません。
CASCADEを指定している場合,被参照表及び参照表にSQLを実行するときの動作の例を図12-32及び図12-33に示します。
図12-32 被参照表に更新SQLを実行するときの動作の例(CASCADE指定時)
図12-33 参照表に更新SQLを実行するときの動作の例(CASCADE指定時)
CASCADEを指定している場合の主キーに対する操作と参照表の動作を表12-11に,外部キーに対する操作と被参照表の動作を表12-12に示します。
表12-11 主キーに対する操作と参照表の動作(CASCADE指定時)
主キーに対する操作 | 被参照表と参照表の行の関係 | 主キーに対する操作結果 | 参照表の動作 |
---|---|---|---|
挿入(INSERT文) | なし | ○ | 動作しない |
更新(UPDATE文), 削除(DELETE文) |
更新前の主キー構成列の値と同じ外部キー構成列の値を持つ行が,参照表にある | ○ | 主キーと同じ値で更新,又は行削除 |
更新前の主キー構成列の値と同じ外部キー構成列の値を持つ行が,参照表にない | ○ | 動作しない |
表12-12 外部キーに対する操作と被参照表の動作(CASCADE指定時)
外部キーに対する操作 | 参照表と被参照表の行の関係 | 外部キーに対する操作結果 | 被参照表の動作 | |
---|---|---|---|---|
挿入(INSERT文) | 挿入する行の外部キー構成列の値と同じ主キー構成列の値を持つ行が被参照表にある | ○ | 動作しない | |
挿入する行の外部キー構成列の値と同じ主キー構成列の値を持つ行が被参照表にない | 外部キー構成列中にナル値がある | ○ | ||
外部キー構成列中にナル値がない | × | |||
更新(UPDATE文) | 更新後の外部キー構成列の値と同じ主キー構成列の値を持つ行が被参照表にある | ○ | 動作しない | |
更新後の外部キー構成列の値と同じ主キー構成列の値を持つ行が被参照表にない | 外部キー構成列中にナル値がある | ○ | ||
外部キー構成列中にナル値がない | × | |||
削除(DELETE文) | なし | ○ | 動作しない |
なお,CASCADEを指定すると,主キーの変更を外部キーにも反映するため,表定義時にHiRDBが内部的にトリガを生成します。参照制約動作のトリガ,及びユーザが定義するトリガとの関係については,「12.19.6 参照制約とトリガ」を参照してください。
RESTRICTを指定すると,被参照表の主キーに変更がある場合,外部キーに同じ値の行があれば,参照制約違反エラーになり,主キーは変更されません。なお,外部キーに変更がある場合,主キーに同じ値の行があるかどうかをチェックして,参照制約違反エラーになれば外部キーは変更されません。
RESTRICTを指定している場合,被参照表に更新SQLを実行するときの動作を次の図に示します。参照表の動作は,CASCADE指定時(図12-33を参照)と同じです。
図12-34 被参照表に更新SQLを実行するときの動作の例(RESTRICT指定時)
RESTRICTを指定している場合の主キーに対する操作と被参照表及び参照表の動作を次の表に示します。外部キーに対する操作と被参照表の動作はCASCADE指定時(表12-12を参照)と同じです。
表12-13 主キーに対する操作と被参照表及び参照表の動作
主キーに対する操作 | 被参照表と参照表の行の関係 | 主キーに対する操作結果 | 参照表の動作 |
---|---|---|---|
挿入(INSERT文) | なし | ○ | 動作しない |
更新(UPDATE文), 削除(DELETE文) |
更新前の主キー構成列の値と同じ外部キー構成列の値を持つ行が,参照表にある | × | 動作しない |
更新前の主キー構成列の値と同じ外部キー構成列の値を持つ行が,参照表にない | ○ |
被参照表と参照表の表定義,表定義変更,及び表削除時の制限事項を次に示します。
参照制約の定義例を次に示します。
被参照表と参照表が1対1の場合の定義例を次に示します。
CREATE TABLE SEIZOUMOTO (SNO CHAR(4),SNAME NCHAR(6),TELEPHONE CHAR(12)) PRIMARY KEY(SNO) …主キーの指定 CREATE TABLE SHOHIN (GNO CHAR(4),SNO CHAR(4),GNAME NCHAR(10),SURYO INTEGER) CONSTRAINT SHOHIN_FK …制約名の指定 FOREIGN KEY(SNO) …外部キーの指定 REFERENCES SEIZOUMOTO …被参照表名の指定
CREATE TABLE SEIZOUMOTO (SNO CHAR(4),SNAME NCHAR(6),TELEPHONE CHAR(12)) PRIMARY KEY(SNO) …主キーの指定 CREATE TABLE SHOHIN (GNO CHAR(4),SNO CHAR(4),GNAME NCHAR(10),SURYO INTEGER) CONSTRAINT SHOHIN_FK …制約名の指定 FOREIGN KEY(SNO) …外部キーの指定 REFERENCES SEIZOUMOTO …被参照表名の指定 ON UPDATE CASCADE …更新時の参照制約動作の指定 ON DELETE CASCADE …削除時の参照制約動作の指定
被参照表が1,参照表が2の場合の定義例を次に示します。
CREATE TABLE SHOHIN (GNO CHAR(4),SNO CHAR(4),GNAME NCHAR(10),SURYO INTEGER) PRIMARY KEY(GNO) …主キーの指定 CREATE TABLE SIIRE (GNO CHAR(4),GNAME NCHAR(10),SSURYO INTEGER) CONSTRAINT SIIRE_FK …制約名の指定 FOREIGN KEY(GNO) …外部キーの指定 REFERENCES SHOHIN …被参照表名の指定 ON UPDATE CASCADE …更新時の参照制約動作の指定 ON DELETE CASCADE …削除時の参照制約動作の指定 CREATE TABLE URIAGE (DNO CHAR(4),CNO CHAR(4),GNO CHAR(4),USURYO INTEGER) CONSTRAINT URIAGE_FK …制約名の指定 FOREIGN KEY(GNO) …外部キーの指定 REFERENCES SHOHIN …被参照表名の指定 ON UPDATE RESTRICT …更新時の参照制約動作の指定 ON DELETE RESTRICT …削除時の参照制約動作の指定
被参照表が2,参照表が1の場合の定義例を次に示します。
CREATE TABLE SHOHIN (GNO CHAR(4),SNO CHAR(4),GNAME NCHAR(10),SURYO INTEGER) PRIMARY KEY(GNO) …主キーの指定 CREATE TABLE KOKYAKU (CNO CHAR(4),CNAME NCHAR(8),ADDR NCHAR(24)) PRIMARY KEY(CNO) …主キーの指定 CREATE TABLE URIAGE (DNO CHAR(4),CNO CHAR(4),GNO CHAR(4),USURYO INTEGER) CONSTRAINT URIAGE_SHOHIN_FK …制約名の指定 FOREIGN KEY(GNO) …外部キーの指定 REFERENCES SHOHIN …被参照表名の指定 ON UPDATE CASCADE …更新時の参照制約動作の指定 ON DELETE CASCADE …削除時の参照制約動作の指定 CONSTRAINT URIAGE_KOKYAKU_FK FOREIGN KEY(CNO) …外部キーの指定 REFERENCES KOKYAKU …被参照表名の指定 ON UPDATE CASCADE …更新時の参照制約動作の指定 ON DELEYE CASCADE …削除時の参照制約動作の指定
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.