SQL 解説書

制約

制約 とは、 データベース・マネージャーによって課せられる規則のことです。

制約には次の 3 つのタイプがあります。

参照制約および表検査制約はオン / オフの切り換えが可能です。 一般に、大量のデータをデータベースにロードする場合には、 制約の実施検査をオフにします。 制約の設定の切り換えについては、SET INTEGRITY を参照してください。

固有制約

固有制約 は、 表内でその値が固有である場合にのみキーの値を有効とする規則です。 固有制約は任意選択であり、 PRIMARY KEY 文節または UNIQUE 文節を使用して、 CREATE TABLE または ALTER TABLE ステートメントで定義することができます。 固有制約に指定される列は、NOT NULL として定義する必要があります。 固有索引は、固有制約の列の変更時にキーの固有性を実現するためにデータベース・マネージャーによって使用されます。

表には任意の数の固有制約を指定することができますが、 基本キーとして定義されるのは最大 1 つの固有制約です。 表には、同一の一連の列に複数の固有制約を指定することはできません。

参照制約の外部キーによって参照される固有制約は、 親キー と呼ばれます。

CREATE TABLE ステートメントで固有制約が定義される場合に、 固有索引がデータベース・マネージャーによって自動的に作成され、 システムに必須の基本索引または固有索引として指定されます。

固有制約が ALTER TABLE ステートメントで定義され、 しかも同一列に索引が存在する場合、 その索引は固有かつシステム必須として指定されます。 このような索引が存在しない場合、 固有索引がデータベース・マネージャーによって自動的に作成され、 システムに必須の基本索引または固有索引として指定されます。

固有制約の定義と固有索引の作成とは明らかに異なることに注意してください。 いずれも固有性を実現しますが、固有索引はヌル可能列を使用することができ、 通常、親キーとして使用することはできません。

参照制約

参照保全 とは、 すべての外部キーのすべての値が有効であるデータベースの状態のことです。 外部キー とは、 その値が親表の行の基本キーまたは固有キーの少なくとも 1 つの値と一致する必要がある表内の列または列の集合です。 参照制約 は、 外部キーの値を以下の場合にのみ有効とする規則です。

親キーを含む表は参照制約の親表 と呼ばれ、 外部キーを含む表はその表の従属 表と呼ばれます。

参照制約はオプションであり、 CREATE TABLE ステートメントおよび ALTER TABLE ステートメントで定義することができます。 参照制約は、データベース・マネージャーによって、 INSERT、UPDATE、DELETE、ALTER TABLE ADD CONSTRAINT、 および SET INTEGRITY ステートメントの実行の過程で課せられます。 これが有効に実施されるのは、ステートメントの完了時です。

RESTRICT の削除または更新規則を伴う参照制約は、 他のすべての参照制約より先に課せられます。 NO ACTION の削除または更新規則を伴う参照制約は、 ほとんどの場合、RESTRICT と同じように動作します。 ただし、特定の SQL ステートメントでは異なる場合があります。

参照保全、検査制約、およびトリガーは実行時に結合されることがあります。 これらの要素の結合については、付録 J, トリガーと制約の相互作用を参照してください。

参照保全の規則に関係した概念および用語には、次のものがあります。

親キー
参照制約の基本キーまたは固有キー。

親行
少なくとも 1 つの従属行をもつ行。

親表
参照制約の親キーを含む表。 表は、任意の数の参照制約に関して親として定義することができます。 ある参照制約で親となっている表が、他の参照制約の従属となる場合もあります。

従属表
最低限 1 つの参照制約が定義に含まれている表。 表は、任意の数の参照制約に関して従属として定義することができます。 ある参照制約で従属となっている表が、他の参照制約の親となる場合もあります。

下層表
ある表が T の従属であるか、または T の従属の下層である場合、その表は表 T の下層です。

従属行
少なくとも 1 つの親行をもつ行。

下層行
ある行が行 p の子孫であるのは、その行が p の従属行である場合、 または p の従属行の子孫である場合です。

参照サイクル
参照制約の集合で、その集合内のそれぞれの表がそれ自身の下層であるもの。

自己参照行
自分自身の親である行。

自己参照表
同じ参照制約の中で親であり従属でもある表。 この場合の制約は自己参照制約 と呼ばれます。

挿入規則

参照制約の挿入規則は、 外部キーのヌル値以外の挿入値が親表の親キーの何らかの値と一致していなければならない、 というものです。 複合外部キーの場合、値がヌル値であるのは、 その構成要素のどれかがヌル値である場合です。 この規則が暗黙的であるのは、外部キーが指定されている場合です。

更新規則

参照制約の更新規則は、参照制約の定義時に指定されます。 選択項目には NO ACTION と RESTRICT があります。 更新規則は、親の行または従属表の行が更新されるときに適用されます。

親行の場合、親キーの列の値が更新されると、次のようになります。

従属行の場合、外部キーが指定されると、暗黙的な更新規則は NO ACTION です。 NO ACTION は、更新ステートメントの完了時に、 外部キーのヌル値以外の更新値が親表の親キーの何らかの値に一致していなければならないことを意味します。

複合外部キーの場合、値がヌル値であるのは、 その構成要素のどれかがヌル値である場合です。

削除規則

参照制約の削除規則は、参照制約の定義時に指定されます。 選択項目としては、NO ACTION、RESTRICT、CASCADE、または SET NULL があります。 SET NULL を指定できるのは、 外部キーの列の中にヌル値が可能なものがある場合だけです。

参照制約の削除規則は、親表の行が削除されるときに適用されます。 もっと正確に言い換えれば、この規則は、 親表の行が削除または (後で定義する) 伝送した削除操作の対象となっており、 参照制約の従属表の中にその行の従属行がある場合に適用されます。 たとえば、P が親表、D が従属表、 そして p が削除または伝送削除操作の対象である親行を指すものとします。 この場合の削除規則は以下のとおりです。

表が親となっている参照制約にはそれぞれ独自の削除規則があり、 適用可能な削除規則のすべてを使用して削除操作の結果が決められます。 したがって、ある行の従属行が削除規則 RESTRICT か NO ACTION の参照制約になっている場合、 または、削除規則 RESTRICT か NO ACTION の参照制約の従属である子孫のどれかに対して削除がカスケードしている場合、 その行を削除することはできません。

親表 P から行を削除すると、他の表もこの操作に関係し、 その表の行に以下のような影響が出る場合があります。

P での削除操作に関係する可能性のある表は、 P に連結削除 されている、と言われます。

したがって、ある表が P の従属表であるか、 または P からの削除操作のカスケード先の表の従属表である場合、 この表は表 P に対して連結削除されることになります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]