今回は,データベースオブジェクトの作成について解説していきましょう。データベースオブジェクト(以下,オブジェクト)には,次のものがあります。

 ・表:データを格納する
 ・ビュー:表に対する問い合わせに名前を付けて定義する
 ・順序:一意な数値を生成する
 ・索引:検索の速度を速くするため,表の列に定義する

 また,オブジェクトの名前は,次の命名規則に従って付けなければいけません。

 ・最大30バイト
 ・文字,数字,記号($,#,_)が使用できる
 ・先頭は文字で始める
 ・予約語(SQLコマンドのSELECT,INSERTやORACLEなど)は使用できない

CREATE TABLE文による表の作成

 まずは,表の作成から始めましょう。表を作成する場合の基本構文は,次の通りです。

CREATE TABLE 表名 
(列名 データ型[(有効桁数)]
 [ [CONSTRAINT 制約名] 制約内容 ] [ DEFAULT デフォルト値], ・・・ ) ]
 [ ,列名 ・・・] )

 表名だけでなく,列名も前述の命名規則に従わなければいけません。また,データ型には,表1に示すものがあります。

表1●Oracle Databaseが提供するデータ型
データ型説明
VARCHAR2(size)可変長文字データ ( size:1~4000 )
CHAR(size)固定長文字データ ( size:1~2000 )
NUMBER(p,s)可変長数値 ( p:精度1~38,s:位取り-84~127 )
DATE日付(紀元前4712年1月1日~西暦9999年12月31日)
TIMESTAMP小数秒を含む日付
INTERVAL YEAR TO MONTH年および月の間隔
INTERVAL DAY TO SECOND日と時間,分,秒の間隔
LONG可変長文字データ(最大2GB)
CLOB文字データ(最大4GB)
BLOBバイナリデータ(最大4GB)
BFILE外部ファイルに格納されるバイナリデータ(最大4GB)
RAW(size),LONG RAW長さsizeのRAWバイナリデータ(最大2000),最大2GBの可変長のRAWバイナリデータ

 「DATE」と「TIMESTAMP」は日付だけでなく時刻(時,分,秒)も含み,「TIMESTAMP」は最大9桁までの小数秒も含みます。LONGは,表に1つしか宣言できず,GROUP BY句やORDER BY句で使用できないといった制限があります。

 では,部門データを管理するためのDEPT表を作成するCREATE TABLE文を見てみましょう(図1)。

図1●DEPT表の作成
図1●DEPT表の作成

 図1の(1)と(2)は制約を宣言しています。制約には「列制約構文」と「表制約構文」があります。列制約構文は,列ごとに制約を宣言するときに使用する方法です。表制約構文は,すべての列の宣言が終わった後で定義する方法で,複数の列を組み合わせて制約を定義したいときなどに使用します。(1)と(2)は各列の宣言の直後に指定していますので,列制約構文です。

 図1の制約を詳しく見ていきましょう。(1)は,制約名「DEPT_PK」という,PRIMARY KEY(主キー)制約を定義しています。PRIMARY KEY制約は表に1つしか定義できません。ただし,複数の列をまとめて,1つのPRIMARY KEY制約を定義することは可能です。PRIMARY KEY制約を定義した列または列の組み合わせは,値が一意で(列の組み合わせの場合は値の組み合わせが一意で),なおかつ必ず値を入力する(NULLを認めない:NOT NULL)必要があります。

 (2)は,制約名「DNAME_NN」という,NOT NULL制約を宣言しています。NOT NULL制約は,「NULLを認めない」という意味なので,必ず値を入力する必要があります。NOT NULL制約は,列制約構文でしか指定できません。

 図1の(3)は,DEFAULT句を使って,INSERT時に値を指定しなかった場合に使用される「省略時解釈値」を定義しています。図1の場合,LOC列に値を指定しなかったときは,値は「NULL」ではなく「東京」が挿入されます。

 「PRIMARY KEY」や「NOT NULL」を含め,Oracle Databaseが提供する制約は表2の通りです。

表2●Oracle Databaseが提供する制約
制約内容
NOT NULLNULLを認めない。必須。
列制約構文で指定する必要がある
UNIQUE(一意)重複を認めない。一意。
一意索引が自動的に作成される。
CHECK指定した式を満たさない値は認めない。
ほかの行の値を参照するような副問い合わせやSYSDATE関数(現在の日付を取得する関数)および順序に関する擬似列は使用することができない
PRIMARY KEY(主キー)行を識別する列または列の組み合わせ。主キー。
NOT NULLでUNIQUEであるかどうかが評価される。1つの表に1つしか定義できない。一意索引が自動的に作成される。
FOREGIN KEY(外部キー)参照先に存在する値でなければ認めない。外部キー,参照整合性制約。
参照先の列には,PRIMARY KEYまたはUNIQUE制約が定義されている必要がある。表制約構文時には,「FOREIGN KEY(列名)」キーワードの指定が必要