InterBase クイック スタート:Part II - 主キーと外部キー
InterBase クイック スタート:Part II - データ定義 へ戻る
Job
テーブル定義には、主キーと外部キーが含まれています。
- 主キーは、行を一意に識別するための、1 つの列、または列のグループです。 テーブルは、必ず主キーを持っていなければなりません。 また、テーブルは主キーを複数持つことはできません。
PRIMARY KEY
特性は列定義の一部として(Country
テーブルの最初の列の中で)指定するか、もしくは、CREATE TABLE
文の単独句として(Job
テーブルを作成する文の中で)指定することができます。Job
テーブルの主キーは、次の 3 つの列から構成されています:job_code
、job_grade
、job_country
。これらの列のいずれかを単独でみると、ある値がこれらの列にいずれかに複数回出現することはあり得ますが、これらが集まって主キーとなっているということは、3 つの値による組合せが、複数の行で発生しないことを意味します。
- 外部キーは、あるテーブルの 1 つの列、または列のセットで、その値は、他の(または同じ)テーブルの主キーの値の中に一致するものがなければなりません。 外部キーは、主キーを参照すると言います。 外部キーは、データの整合性を維持するためのメカニズムです。 たとえば、
Job
テーブルのjob_country
列に一覧されている国は、Country
テーブルにも存在しなければなりません。
UNIQUE
、FOREIGN KEY
、PRIMARY KEY
といった制約を、列定義の一部として、または、列定義に続くテーブル制約の一部として、宣言することができます。 構文は、どのアプローチを選択したかによって、若干変わってきます。 詳細については『言語リファレンス ガイド』を参照してください。
Country
やDepartment
テーブルでは、主キーの制約を、列定義の一部として宣言しました。Job
テーブルに対しては、主キー、外部キー、および、チェック制約を、テーブル レベルで宣言しています。 両アプローチとも、同じ結果がでます。
参照整合性の制約のカスケード
外部キーを作成する際、外部キーでの値が、それが参照している主キーの中にも存在しなければなりません。 しかし、もし後から、参照されている主キーの値が、変更もしくは削除されたらどうなるでしょう? 参照整合性の制約のカスケードでは、その際にどうしたらいいかを指定することができます。 選択肢には、何も行わない、その変更を外部キー列に伝播(カスケード)する、外部キーをそのデフォルト値に設定する、または、NULL
に設定する、などがあります。
外部キーを、列定義の一部として指定する場合、構文は次のようになります:
CREATE TABLE table_name
(
column_name data_type FOREIGN KEY
REFERENCES other_table(columns)
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}],
[, column_definition]
)
外部キーをテーブルレベルの制約として指定した場合も、構文は同様です。この場合、制約を定義する列を指定しなければなりません。
CREATE TABLE table_name
(
column_definitions,
FOREIGN KEY (column_name) REFERENCES other_table(columns)
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}],
[, table_constraints]
)
チュートリアルのもう少し後で、ALTER TABLE
を使用して、Department
テーブルに列と制約を追加します。その際、参照整合性のための制約のカスケードも含めます。
命名の制約
制約を宣言する際、任意の CONSTRAINT
キーワードの後ろに名前を指定して、その制約に名前を付けることができます。これにより、ALTER TABLE 文を使用して、その制約をドロップすることができます。Job
テーブル定義では、2 つの制約に名前があり(pkjob
と fkjob
)、CHECK
制約には名前がありません。
計算列
テーブルを作成する際に、テーブル内の 1 つまたは複数の列の値を基にした値を持つ、列を定義することができます。 この計算には、列のデータ型に適していればどんな演算オペレーションも含めることができます。
- 例を見るには、スクリプト
TABLES.SQL
を開き、Employee
テーブルに対して次の列定義を見てください:
full_name COMPUTED BY (last_name || ', ' || first_name)
full_name
列の値は、last_name
列の値 + カンマ + first_name
列の値から構成されています。