今回は,データベースオブジェクトの作成について解説していきましょう。データベースオブジェクト(以下,オブジェクト)には,次のものがあります。
・表:データを格納する
・ビュー:表に対する問い合わせに名前を付けて定義する
・順序:一意な数値を生成する
・索引:検索の速度を速くするため,表の列に定義する
また,オブジェクトの名前は,次の命名規則に従って付けなければいけません。
・最大30バイト
・文字,数字,記号($,#,_)が使用できる
・先頭は文字で始める
・予約語(SQLコマンドのSELECT,INSERTやORACLEなど)は使用できない
CREATE TABLE文による表の作成
まずは,表の作成から始めましょう。表を作成する場合の基本構文は,次の通りです。
|
表名だけでなく,列名も前述の命名規則に従わなければいけません。また,データ型には,表1に示すものがあります。
データ型 | 説明 |
---|---|
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の(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の通りです。
制約 | 内容 |
---|---|
NOT NULL | NULLを認めない。必須。 列制約構文で指定する必要がある |
UNIQUE(一意) | 重複を認めない。一意。 一意索引が自動的に作成される。 |
CHECK | 指定した式を満たさない値は認めない。 ほかの行の値を参照するような副問い合わせやSYSDATE関数(現在の日付を取得する関数)および順序に関する擬似列は使用することができない |
PRIMARY KEY(主キー) | 行を識別する列または列の組み合わせ。主キー。 NOT NULLでUNIQUEであるかどうかが評価される。1つの表に1つしか定義できない。一意索引が自動的に作成される。 |
FOREGIN KEY(外部キー) | 参照先に存在する値でなければ認めない。外部キー,参照整合性制約。 参照先の列には,PRIMARY KEYまたはUNIQUE制約が定義されている必要がある。表制約構文時には,「FOREIGN KEY(列名)」キーワードの指定が必要 |