データベースの作成
PSQL データベースは、以下の 2 つの部分から構成されています。
•データを記述するデータ辞書
•データを物理的に取り込むデータ ファイル
この章では、名前付きデータベースとバウンド データベースについて説明するほか、データベースの作成方法についても説明します。それ以降のセクションでは、データベースの作成に伴うデータ辞書の作成、データベースのテーブル、列およびインデックスの作成方法について説明します。
名前付きデータベース
名前付きデータベースには論理名があり、ユーザーはその論理名の実際の場所がわからなくても識別できます。データベースに名前を付ける際は、その名前を特定の辞書ディレクトリのパスおよび 1 つまたは複数のデータ ファイルのパスに関連付けるようにします。データベース名を使って PSQL にログインするとき、PSQL ではその名前を使って、データベースの辞書とデータ ファイルを検索します。データベースに名前を付けないと、以下のことを行えません。
•トリガーの定義
•主キーと外部キーの定義
•データベースのバインド
•データベースの整合性制約の停止
既存のアンバウンド データベースに名前を付けたり、新しいバウンド データベースを作成したりするには、PSQL Control Center を使用します。詳細については、『PSQL User's Guide』を参照してください。
バウンド データベース
データベースをバインドすると、データのアクセスに使用する方法とは無関係に、MicroKernel はデータベースの定義済みセキュリティ、参照整合性(RI)およびトリガーを設定できます。MicroKernel は、以下のようにこれらの整合性のコントロールを設定します。
•バウンド データベース上でセキュリティを定義すると、Btrieve ユーザーはそのデータベースにアクセスできません。
•アンバウンド データベース上でセキュリティを定義すると、Btrieve ユーザーはそのデータベースにアクセスできます。
•バウンド データベース上でセキュリティを定義しないと、Btrieve ユーザーは以下のようにデータ ファイルにアクセスできます。
バウンド ファイルの制約 | Btrieve を使用するアクセスのレベル |
RI 制約の定義あり | ユーザーは、RI 制約内ですべてのものにアクセスして実行できます。 |
INSERT トリガーの定義あり | 読み取り専用、更新および削除アクセス |
UPDATE トリガーの定義あり | 読み取り専用、挿入および削除アクセス |
DELETE トリガーの定義あり | 読み取り専用、挿入および更新アクセス |
バウンド ファイルに複数の制約が存在する場合、アクセス レベルは制限される最大限の制約に従います。たとえば、ファイルに INSERT トリガーと UPDATE トリガーが定義されている場合は、読み取り専用および削除アクセスが行えます。
メモ: たとえデータベースをバインドしなくても、データ ファイルにトリガーがあるか、外部キーがあるか、あるいは外部キーで参照される主キーがある場合、PSQL はデータ ファイルにバウンドというスタンプを自動的に付けます。したがって、データ ファイルはアンバウンド データベースの一部であっても、バインドされていることになります。そのような場合、MicroKernel はそのファイルがバウンド データベースの一部であるかのようにファイルに整合性制約を設定します。
バウンド データベース内の辞書ファイルとデータ ファイルは、ほかの名前付きデータベースでは参照できません。また、バウンド データ ファイルはデータベース内のほかのテーブルでは参照できません。
バウンド データベースを作成するか、既存のデータベースをバインドする場合、PSQL はすべての辞書ファイルとデータ ファイルにバウンド データベースの名前を付けます。また、PSQL はすべてのデータ ファイルにそのデータ ファイルに関連するテーブルの名前を付けます。また、データベースに新しいテーブルまたは辞書ファイルを追加すると、PSQL はそれらを自動的にバインドします。
データベース コンポーネントの作成
データベースを作成するには、PSQL Control Center を使用します。『PSQL User's Guide』を参照してください。
データベースにテーブルを作成するには、PSQL Control Center を使用するか、『SQL Engine Reference』で定義されている CREATE TABLE 構文を使用します。CREATE TABLE ステートメントを発行する場合は、列を定義するコマンドを取り込む必要があります。また、参照整合性(RI)制約を定義するコマンドを取り込むこともできます。
名前付け規則
データベースを作成する場合、PSQL では各データベース コンポーネントに記述名を付けることができます。ユーザーとアプリケーションは、これらの名前でデータベースのコンポーネントを参照します。ここでは、データベース コンポーネントに名前を付けるときに従うべき規則について概説します。
詳細については、『
Advanced Operations Guide』の
識別子の種類別の制限を参照してください。
一意名
以下のデータベース コンポーネントは、辞書に一意名を持っていなければなりません。
•テーブル
•ビュー
•インデックス
•キー
•ユーザー名
•グループ名
•ストアド プロシージャ
•トリガー
•1 つのテーブル内の列名
パラメーターと変数の名前は、SQL ステートメント内で一意でなければなりません。PSQL キーワードは予約語であるため、データベース コンポーネントに名前を付けるためにそれらのキーワードを使用したり、パラメーター名や変数で使用することはできません。予約キーワードのリストについては、『
SQL Engine Reference』の
SQL の予約語を参照してください。
異なるテーブルで列名が重複している場合、関連するテーブル名またはエイリアス名を列名の前に置くことによって、各テーブル内に列名の修飾を行うことができます。たとえば、Student テーブルの ID 列を Student.ID として参照できます。これは、完全修飾された列名であり、テーブル名(Student)は列修飾子です。
有効な文字
以下に、SQL レベルでのデータベース コンポーネントの名前に対する有効な文字と、変数およびパラメーター名に対する有効な文字を示します。
•a ~ z
•A ~ Z
•0 ~ 9
•_(アンダスコア)
•^(キャレット)
•~(チルダ)
•$(ドル記号)
メモ: データベース コンポーネントの名前の先頭は文字でなければなりません。データベース コンポーネントの名前、またはこれらの規則に従わないパラメーター名を指定する場合は、"name" のように二重引用符で囲んで名前を指定します。
名前の最大長
PSQL では、辞書内のデータベース コンポーネント名の最大長に制限があります。『
Advanced Operations Guide』の
識別子の種類別の制限、および『
SQL Engine Reference』の
PSQL 機能の制限/条件を参照してください。
大文字と小文字の区別
PSQL は、データベース コンポーネント名を定義する場合に大文字と小文字を区別します。TaBLe1 という名前のテーブルを作成する場合、PSQL はテーブル名を TaBLe1 として辞書に格納します。ユーザー名、ユーザー グループ名およびパスワードを例外として、PSQL はコンポーネント名を定義した後に大文字と小文字を区別しません。テーブル TaBLe1 を定義した後、そのテーブルを table1 として参照できます。
ユーザー名、ユーザー グループ名およびパスワードは、PSQL で大文字と小文字を区別します。たとえば、マスター ユーザーとしてログインする場合、ユーザー名を Master として指定する必要があります。
データを取得する場合、作成された状態に基づいて、PSQL はテーブル、ビュー、エイリアスおよび列名を表示します。
SELECT *
FROM Course#
PSQL は、以下のように列名を返します。
"Name", "Description", "Credit_Hours", "Dept_Name"
データ辞書の作成
PSQL は、辞書を使用してデータベースに関する情報を格納します。辞書は、データベースのテーブルとビューを記述するいくつかのシステム テーブルから構成されています。
システム テーブルには、インデックス定義、例の特性、保全性とセキュリティ情報などの数種類のデータベース情報が含まれています。表
41 は PSQL が作成するシステム テーブルを示しています。『
SQL Engine Reference』のツール、
システム テーブルも参照してください。
表 41 PSQL システム テーブル
操作 | 結果テーブル |
データ辞書の作成 | X$File、X$Field、X$Index |
列の属性の指定 | X$Attrib |
ストアド SQL プロシージャの作成 | X$Proc |
データベース セキュリティの定義 | X$User、X$Rights |
参照制約の定義 | X$Relate |
ビューの定義 | X$View |
トリガーの定義 | X$Trigger、X$Depend |
システム テーブルはデータベースの一部であるため、システム テーブルに照会してそれらの内容を決定できます。適切な権利があれば、システム テーブルを作成したり、それらの内容を変更することもできます。
メモ: PSQL は、システム テーブル内のいくつかのデータを表示しません。たとえば、ストアド ビューおよびストアド プロシージャの名前以外の情報は、PSQL でしか使用できません。また、ユーザー パスワードなどのいくつかのデータは暗号化された形式で表示されます。
各システム テーブルの内容をすべて参照する場合は、『SQL Engine Reference』を参照してください。
辞書を作成すると、データベースにテーブル、列およびインデックスを追加できます。
►名前付きデータベースの作成は、以下の手順で行います。
メモ: 参照整合性やトリガーなどのいくつかの機能を使用するには、名前付きデータベースが必要です。
1 新しい辞書テーブルを格納するためのディレクトリを作成します。
2 名前付きデータベースを追加するには、PSQL Control Center を使用します。『
PSQL User's Guide』の
新規データベースを作成するにはを参照してください。
►名前なしデータベースの辞書の作成は、以下の手順で行います。
1 PSQL DDF Builder を実行します。
2 データ辞書ファイル(DDF)の作成については、『
DDF Builder User's Guide』の情報を確認してください。
DDF Builder についてを参照してください。
テーブルの作成
テーブルを作成する場合は、テーブルに名前を付ける必要があります。各テーブル名は、データベース内で固有の名前である必要があります。テーブル名を付ける規則の詳細については、
名前付け規則を参照してください。
どのテーブルをデータベースに作成するかを決定する場合は、さまざまなユーザーが
ビューを使用してさまざまな組み合わせでデータを見ることができるように考慮してください。ビューはテーブルに似ており、多くの目的、たとえば、データの取得、更新、削除などの目的でテーブルとして処理することができます。しかし、ビューは必ずしも 1 つのテーブルだけに関連付けられているわけではありません。ビューは、複数のテーブルから情報を組み合わせることができます。詳細については、
データの取得を参照してください。
PSQL Control Center を使用してテーブルを作成することができます。『
PSQL User's Guide』の
新規テーブルのために Table Editor を起動するにはを参照してください。
エイリアス
以下のステートメント要素内のテーブル名にエイリアス(エイリアス名とも呼ぶ)を割り当てることができます。
•SELECT または DELETE ステートメントの FROM 句
•INSERT ステートメントの INTO 句
•UPDATE ステートメント内のテーブルのリスト
メモ: エイリアスは、エイリアスを使用するステートメントにのみ適用されます。PSQL は、データ辞書にエイリアスを格納しません。
エイリアスは、最大 20 文字の組み合わせとすることができます。テーブル名とエイリアス名は常に空白で区切ります。エイリアスと列名はピリオド(.)で区切ります。一度特定のテーブルのエイリアスを指定したら、ステートメント内であればどこでも、テーブルの列名の修飾に使用することができます。
以下の例では、Student テーブルにエイリアス名 s を、Enrolls テーブルに エイリアス名 e を指定しています。
SELECT s.ID, e.Grade
FROM Student s, Enrolls e
WHERE s.ID = e.Student_ID#
エイリアスを使用して以下のことが行えます。
•長いテーブル名を置き換える。
対話形式で作業している場合、エイリアスを使用すると、特に列名を修飾しなければならないときにキーボード入力時間を節減できます。たとえば、以下のステートメントではエイリアスとして、Student テーブルには s、Enrolls テーブルには e、Class テーブルには c1 を割り当てています。この例では、エイリアスを使用して、選択リストと WHERE 条件の各列のソースを区別しています。
SELECT s.ID, e.Grade, c1.ID
FROM Student s, Enrolls e, Class c1
WHERE (s.ID = e.Student_ID) AND
(e.Class_ID = c1.ID)#
•ステートメントを読みやすくします。単一のテーブル名を持つステートメントでも、エイリアスはステートメントを読みやすくすることができます。
•相関されたサブクエリ内の外側のクエリのテーブルを使用します。
SELECT s.ID, e.Grade, c1.ID
FROM Student s, Enrolls e, Class c1
WHERE (s.ID = e.Student_ID) AND
(e.Class_ID = c1.ID) AND
e.Grade >= (SELECT MAX (e2.Grade)
FROM Enrolls e2
WHERE e2.Class_ID = e.Class_ID)#
列の作成
CREATE TABLE ステートメントを使用してテーブルを作成する際に列を作成するか、ALTER TABLE ステートメントを使用して既存のテーブルに列を追加することができます。いずれの場合も、以下の特性を指定する必要があります。
•列名 - 列を識別します。各列名は、テーブル内で固有の名前にする必要があり、また、20 文字を超えることはできません。PSQL は、データベースの列名を定義する場合に大文字と小文字を区別しますが、列名を定義した後は大文字と小文字を区別しません。たとえば、
ColuMN1 という列を作成する場合、名前は
ColuMN1 として辞書に格納されます。それ以降は、
column1 としてその名前を参照できます。列に名前を付ける規則の詳細については、
名前付け規則を参照してください。
•データ型 - 文字列や数字など、予想するデータの種類と、割り当てるディスク保存領域を識別します。
データ型の詳細については、『Btrieve API Guide』を参照してください。
インデックスの作成
インデックスは、特定の値を検索する操作、または特定の値によって並べ替える操作を最適化します。これらの操作のいずれかを頻繁に実行するすべての列に対し、インデックスを定義します。インデックスは、クエリの最適化において、特定の行または行のグループに対する高速の取得方法を提供します。PSQL は、参照整合性(RI)付きのインデックスも使用します。インデックスは結合におけるパフォーマンスを向上し、クエリを最適化しやすくします。RI の詳細については、『PSQL User's Guide』を参照してください。
PSQL データベースでは、MicroKernel エンジンが定義する物理ファイルの一部としてインデックスを作成し、管理します。MicroKernel エンジン は、Insert、Update、または Delete オペレーションのすべての管理を行います。これらのアクティビティは、すべての PSQL アプリケーションに対して透過的です。
インデックスを作成するには、CREATE INDEX ステートメントを使用します。この方法では、名前付きインデックスを作成します。名前付きインデックスを作成した後、そのインデックスを削除できます。インデックスの削除の詳細については、第
14 章
データの挿入と削除を参照してください。
インデックスを使用して行をソートしたり個々の行を高速に取得できますが、データベースのディスク保存領域が増加し、Insert、Update、または Delete オペレーションにおけるパフォーマンスが多少低下します。インデックスを定義するときは、これらの相殺条件を考慮してください。
次の例では、CREATE INDEX ステートメントを使用して、既に存在するテーブルにインデックスを追加します。
CREATE INDEX DeptHours ON Course(Dept_Name, Credit_Hours)#
メモ: 多数のデータを含むファイルで CREATE INDEX ステートメントを使用する場合は、実行が終了するまでにある程度の時間がかかり、その間はほかのユーザーがそのファイル内のデータにアクセスできないことに注意してください。
CREATE TABLE ステートメントと CREATE INDEX ステートメントの詳細については、『SQL Engine Reference』を参照してください。
インデックス セグメント
同じテーブル内の単一の列または列のグループ上にインデックスを作成できます。複数の列を含むインデックスをセグメント化されたインデックスと呼び、各列をインデックス セグメントと呼びます。
たとえば、サンプル データベースの Person テーブルには以下の 3 つのインデックスがあります。
•Last Name 列と First Name 列から成るセグメント化されたインデックス
•Perm_State + Perm_City 列
•ID 列
インデックス セグメントの数は、データ ファイルのページ サイズの影響を受けます。PAGESIZE キーワードの使用方法の詳細については、『
Btrieve API Guide』を参照してください。テーブルに対して作成できるインデックスの最大数は、データ ファイルのページ サイズと各インデックス内のセグメント数により異なります。表
42 に示すように、ページ サイズが 4096 バイトより小さいデータ ファイルには、ページ サイズ 4096 のデータ ファイルと同じ個数のインデックス セグメントを収容できません。使用するインデックス セグメントの数はファイルのページ サイズによって異なります。
表 42 データ ファイルあたりの最大インデックス セグメント数
ページ サイズ(バイト数) | キー セグメントの最大数(ファイル バージョン別) |
| 8.x 以前 | 9.0 | 9.5 |
512 | 8 | 8 | 切り上げ2 |
1,024 | 23 | 23 | 97 |
1,536 | 24 | 24 | 切り上げ2 |
2,048 | 54 | 54 | 97 |
2,560 | 54 | 54 | 切り上げ2 |
3,072 | 54 | 54 | 切り上げ2 |
3,584 | 54 | 54 | 切り上げ2 |
4,096 | 119 | 119 | 204 |
8,192 | N/A1 | 119 | 420 |
16,384 | N/A1 | N/A1 | 420 |
1 N/A は「適用外」を意味します。 2 「切り上げ」は、ページ サイズを、ファイル バージョンでサポートされる次のサイズへ切り上げることを意味します。たとえば、512 は 1,024 に切り上げられ、2,560 は 4,096 に切り上げるということです。 |
『Status Codes and Messages』マニュアルで、インデックス セグメントと MicroKernel エンジンの関連情報について、ステータス コード 26 "指定されたキーの数が不正です" およびステータス コード 29 "キー長が不正です" を参照してください。
ページ サイズと固定レコード長を使用して、データが格納されている効率性、たとえば、ページあたりの無駄に使用されているバイト数などを計算することができます。ページあたりのレコード数を少なくすることによって、ページレベル ロックでのロックが問題となる並行処理を改善することができます。
デフォルトでは、PSQL はすべてのテーブルをページ サイズ 4096 バイトで作成します。ただし、CREATE TABLE ステートメントの PAGESIZE キーワードを使用してより小さなページ サイズを指定したり、MicroKernel Database エンジンを使用してテーブルを作成し、そのテーブルにより小さなページ サイズを指定することができます。
テーブルに対して定義されたインデックス セグメントの総数を計算する場合、セグメント化されていないインデックスは 1 つのインデックス セグメントとしてカウントされます。たとえば、テーブルに 3 つのインデックスが定義されていて、そのうちの 1 つに 2 つのセグメントがある場合、インデックス セグメントの総数は 4 です。
PSQL Control Center を使用して、定義されたインデックス セグメント数とデータ ファイルのページ サイズを表示できます。このユーティリティの詳細については、『PSQL User's Guide』を参照してください。
インデックス属性
インデックスを作成する場合は、インデックスに一連の特性、つまり、属性を割り当てることができます。インデックス属性は、インデックスの変更可能性と、テーブルに定義するインデックスを PSQL がどのようにソートするかを決定します。インデックス定義を作成または変更するたびに、インデックス属性を指定するパラメーターを取り込むことができます。
インデックスは、以下の属性を持つことができます。
大文字と小文字の区別 | PSQL がソート中に大文字と小文字をどのように評価するかを決定します。デフォルトでは、PSQL は大文字と小文字を区別するインデックスを作成します。大文字と小文字を区別するインデックスを作成するには、インデックスを作成するときに CASE キーワードを指定します。 |
ソート順 | PSQL がどのようにインデックス列の値をソートするかを決定します。デフォルトの設定で、PSQL ではインデックス列の値を昇順(小さいものから大きなものへ)にソートします。降順にソートするインデックスを作成するには、インデックスを作成するときに DESC キーワードを指定します。 |
重複不可 | PSQL を使用して複数の行が同じインデックス列の値を持つことができるかどうかを決定します。デフォルトでは、PSQL は一意でないインデックスを作成します。一意の値を必要とするインデックスを作成するには、インデックスを作成するときに UNIQUE キーワードを指定します。 |
変更可能性 | PSQL が対応する行をソートした後でインデックス列の値を変更できるかどうかを決定します。デフォルトでは、PSQL が行を格納すると、PSQL でインデックス列の値を変更できません。変更可能なインデックスを作成するには、インデックスを作成するときに MOD キーワードを指定します。 |
セグメント化 | インデックスがセグメント化されるかどうか、つまり、1 つのインデックスに結合された列のグループからインデックスを構成するかどうかを指示します。デフォルトでは、PSQL はセグメント化されないインデックスを作成します。CREATE TABLE ステートメントを使用してセグメント化されたインデックスを作成するには、インデックスの最後のセグメントを除き、作成する各インデックス セグメントに SEG キーワードを指定します(SEG キーワードは、指定された次の列が作成するインデックスのセグメントであることを指示します)。 CREATE INDEX コマンドでは一度に 1 つのインデックスだけしか作成できないため、SEG キーワードを使用してセグメント インデックスを指定する必要はありません。複数の列を指定する場合、PSQL は列を指定する順に列を使用してセグメント化されたインデックスを作成します。 |
一部のみ | 列とオーバーヘッドの合計サイズが 255 バイト以上のときに、PSQL が CHAR 列または VARCHAR 列の一部を使用するかどうか、最後または唯一のインデックス列として設計するかどうかを示します。 デフォルトでは、PSQL は部分インデックスを作成しません。CREATE INDEX ステートメントを使用して部分インデックスを作成するには、PARTIAL キーワードを指定します。 |
重複不可能性と変更可能性は、インデックス全体だけに適用されます。重複不可能性または変更可能性は、インデックス全体に適用しなければ、単一のインデックス セグメントに適用することはできません。たとえば、セグメント化されたインデックスを作成し、インデックス セグメントのうちの 1 つに MOD キーワードを指定する場合、すべてのセグメントに対して MOD キーワードを指定する必要があります。
それに対して、インデックス全体に影響を与えずに個々のインデックス セグメントに大文字と小文字の区別、ソート順序、セグメント化を適用できます。たとえば、大文字と小文字を区別するインデックスに大文字と小文字を区別しないインデックス セグメントを作成できます。
以下の条件を満たせば、部分インデックスはインデックス内に定義された最後の列にのみ適用されます。
•その列がインデックスに定義された唯一の列である、または、インデックスに定義された最後の列であること
•最後のインデックス列のデータ型が CHAR または VARCHAR であること
•列のオーバーヘッドを含めたインデックスの合計サイズが 255 バイト以上であること
インデックスの作成および使用可能な属性の詳細については、『
SQL Engine Reference』の
CREATE INDEX を参照してください。