制約とインデックス①



制約とインデックス①

データを正しく操作し、効率よく検索するために、RDBMSには制約とインデックスという機能が用意されています。

1.制約

制約には、次のようなものがあります。それぞれの制約を設定するには、対応するキーワードを指定します。今回は代表的な制約について説明します。代表的な制約には以下のようなものがあります。

・主キー制約
・一意制約
・NOT NULL制約
・デフォルト制約
・チェック制約
・参照整合性制約

それでは一つづつ見ていきます。

(1).主キー制約

表の中の1つの行を特定するために使う列のことを主キーといいます。主キーとなる列は、表の中で行を特定できる値を持っている必要があります。つまり他の行と重複しない、一意の値を持っている必要があります。主キーの設定はテーブル作成時に”Primay Key”キーワードで設定します。構文は以下のとおりとなります。

CREATE TABLE Table-Name (
<Field Name> <Data Type> Primary Key,
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type> … );

(2).一意制約

一意とは、複数の行の間で列の値が重複してはならないということです。一意制約は、列の値が一意になることを保証します。一意制約が設定されている列は、それぞれの行にことなる値を持っていなければなりません。一意制約の設定はテーブル作成時に”Unique”キーワードで設定します。構文は以下のとおりとなります。

CREATE TABLE Table-Name (
<Field Name> <Data Type> Unique,
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type> … );

(3).NOT NULL制約

列に値が登録されていない状態のことを、SQLではNULLと呼び、「NULL値が格納されている」と表現します。テーブルの列には値が入っていることが必ず必要な列があります。例えば従業員表なら氏名、住所など、このような必ず値を入れなければならない列を設定には”NOT NULL”により設定することができます。Not Null制約の設定はテーブル作成時に”Not Null”キーワードで設定します。構文は以下のとおりとなります。

CREATE TABLE Table-Name (
<Field Name> <Data Type> Not Null,
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type> … );

(4).デフォルト制約

表に行を追加する場合、列の値を指定せずに行を挿入すると、その列にはNULL値が格納されます。しかし、デフォルト制約が設定されていれば、特定の既定値が初期値としてセットされます。デフォルト制約では、列に既定値が設定されることを保証します。デフォルト制約の設定はALTER TABLEを使ってテーブル定義を変更することにより設定します。構文は以下のとおりとなります。

【Oracle】
ALTER TABLE Table-Name
MODIFY <Field-Name> <Data Type> DEFAULT ‘xxx’ NOT NULL;

【SQL Server】
ALTER TABLE Table-Name
ALTER COLUMN <Field-Name> <Data Type> DEFAULT ‘xxx’ NOT NULL;

(5).チェック制約

チェック制約は、列に受け入れる値を制限します。例えば、性別(男女)や曜日(日曜~土曜)など、ある特定の値のみ許容するような列があります。そのような列の設定にはチェック制約を使用します。チェック制約の設定はテーブル作成時に”Check”キーワードで設定します。構文は以下のとおりとなります。

CREATE TABLE Table-Name (
<Field Name> <Data Type> Check <比較述語>,
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type> … );

例:性別の場合・・・
<性別> <String> Check (性別 IN(‘男’,’女’,’他’)),

(6).参照整合性制約

例を使って説明します。まず下の図についてですが、3つのリレーションが設定されています。売上表と商品管理表は管理番号で、売上表と商品種別表は種別コードで結びついています。

商品管理表は、外部キーである種別コード列を介して商品種別表を参照しています。つまり、種別コード列を介して2つの表を結合すれば、商品管理表から商品種別表のデータを参照することができます。ここで、商品種別表の種別コード列の値が削除されてしまうと対応するデータがなくなり商品管理表の種別コードから商品種別表のデータの参照ができなくなる可能性があります。
このような場合に備えて、商品管理表の種別コードに対して参照整合性制約を設定します。この制約を設けることによって、参照整合性制約が設定されている外部キーと対応する主キーの整合性が自動的にチェックされて対応する主キー側のデータが削除されようとした際には、参照整合性制約違反となりエラーとなります。このようにして各表の間の整合性が維持されるようになります。この制約を設定する際の構文は以下のとおりとなります。設定には列制約と表制約の2つがあります。(複数の列がある場合は表制約を使用します)

【列制約】
CREATE TABLE Table-Name (
<Field Name> <Data Type> FOREIGN KEY REFERENCES  <参照先表名(<列名>),
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type> … );

【表制約】
CREATE TABLE Table-Name (
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type>,
<Field Name> <Data Type>
CONSTRAINT <外部キー名> FOREIGN KEY (<列名>) REFERENCES <参照先表名>(<列名>));

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です