InterBase クイック スタート:Part II - 主キーと外部キー

提供: InterBase

InterBase クイック スタート:Part II - データ定義 へ戻る

Job テーブル定義には、主キーと外部キーが含まれています。

  • 主キーは、行を一意に識別するための、1 つの列、または列のグループです。 テーブルは、必ず主キーを持っていなければなりません。 また、テーブルは主キーを複数持つことはできません。 PRIMARY KEY 特性は列定義の一部として(Country テーブルの最初の列の中で)指定するか、もしくは、CREATE TABLE 文の単独句として(Job テーブルを作成する文の中で)指定することができます。Job テーブルの主キーは、次の 3 つの列から構成されています: job_codejob_gradejob_country。これらの列のいずれかを単独でみると、ある値がこれらの列にいずれかに複数回出現することはあり得ますが、これらが集まって主キーとなっているということは、3 つの値による組合せが、複数の行で発生しないことを意味します。
  • 外部キーは、あるテーブルの 1 つの列、または列のセットで、その値は、他の(または同じ)テーブルの主キーの値の中に一致するものがなければなりません。 外部キーは、主キーを参照すると言います。 外部キーは、データの整合性を維持するためのメカニズムです。 たとえば、Job テーブルの job_country 列に一覧されている国は、Country テーブルにも存在しなければなりません。
  • UNIQUEFOREIGN KEYPRIMARY KEY といった制約を、列定義の一部として、または、列定義に続くテーブル制約の一部として、宣言することができます。 構文は、どのアプローチを選択したかによって、若干変わってきます。 詳細については『言語リファレンス ガイド』を参照してください。
  • CountryDepartment テーブルでは、主キーの制約を、列定義の一部として宣言しました。 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 つの制約に名前があり(pkjobfkjob)、CHECK 制約には名前がありません。

Image 025.jpg 計算列

テーブルを作成する際に、テーブル内の 1 つまたは複数の列の値を基にした値を持つ、列を定義することができます。 この計算には、列のデータ型に適していればどんな演算オペレーションも含めることができます。

  • 例を見るには、スクリプト TABLES.SQL を開き、Employee テーブルに対して次の列定義を見てください:
full_name COMPUTED BY (last_name || ', ' || first_name)

full_name 列の値は、last_name 列の値 + カンマ + first_name 列の値から構成されています。

次は: