SQL ビューでデータ定義クエリを記述することで、Access でテーブル、制約、インデックス、リレーションシップを作成および変更できます。 この記事では、データ定義クエリと、それらを使用してテーブル、制約、インデックス、リレーションシップを作成する方法について説明します。 この記事は、データ定義クエリを使用するタイミングを決定するのにも役立ちます。
この記事の内容
概要
他の Access クエリとは異なり、データ定義クエリではデータは取得されません。 代わりに、データ定義クエリでは、データ定義言語を使用してデータベース オブジェクトを作成、変更、または削除します。
注: データ定義言語 (DDL) は、構造化クエリ言語 (SQL) の一部です。
データ定義クエリは非常に便利です。 一部のクエリを実行するだけで、データベース スキーマの一部を定期的に削除して再作成できます。 SQL ステートメントに精通していて、特定のテーブル、制約、インデックス、またはリレーションシップを削除して再作成する予定がある場合は、データ定義クエリの使用を検討してください。
警告: データ定義クエリを使用してデータベース オブジェクトを変更すると、アクションに確認ダイアログ ボックスが付属しないため、危険な場合があります。 間違えた場合、データが失われるか、テーブルのデザインが誤って変更される可能性があります。 データ定義クエリを使用してデータベース内のオブジェクトを変更する場合は注意してください。 使用しているデータベースを管理する責任がない場合は、データ定義クエリを実行する前に、データベースの管理者に問い合わせてください。
重要: データ定義クエリを実行する前に、関連するすべてのテーブルのバックアップ コピーを作成します。
DDL キーワード
キーワード |
用途 |
CREATE |
まだ存在しないインデックスまたはテーブルを作成します。 |
ALTER |
既存のテーブルまたは列を変更します。 |
DROP |
既存のテーブル、列、または制約を削除します。 |
ADD |
テーブルに列または制約を追加します。 |
COLUMN |
ADD、ALTER、または DROP で使用する |
CONSTRAINT |
ADD、ALTER、または DROP で使用する |
INDEX |
CREATE で使用する |
TABLE |
ALTER、CREATE、または DROP で使用する |
テーブルを作成または変更する
テーブルを作成するには、CREATE TABLE コマンドを使用します。 CREATE TABLE コマンドの構文は次のとおりです。
CREATE TABLE table_name
(field1 type [(size)] [NOT NULL] [index1] [, field2 type [(size)] [NOT NULL] [index2] [, ...][, CONSTRAINT constraint1 [, ...]])
CREATE TABLE コマンドの必須要素は、CREATE TABLE コマンド自体とテーブルの名前だけですが、通常は、テーブルの一部のフィールドやその他の側面を定義する必要があります。 この簡単な例を考えてみましょう。
購入を検討している中古車の名前、年、価格を格納するテーブルを作成するとします。 名前には最大 30 文字、年には 4 文字まで許可する必要があります。 データ定義クエリを使用してテーブルを作成するには、次の操作を行います。
注: データ定義クエリを実行するには、まずデータベースの内容を有効にする必要がある場合があります。
-
メッセージ バーで [コンテンツの有効化] をクリックします。
テーブルを作成する
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
CREATE TABLE Cars (Name TEXT(30), Year TEXT(4), Price CURRENCY)
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
テーブルを変更する
テーブルを変更するには、ALTER TABLE コマンドを使用します。 ALTER TABLE コマンドを使用して、列または制約を追加、変更、または削除 (削除) できます。 ALTER TABLE コマンドの構文は次のとおりです。
ALTER TABLE table_name predicate
述語には、次のいずれかを指定できます。
ADD COLUMN field type[(size)] [NOT NULL] [CONSTRAINT constraint]
ADD CONSTRAINT multifield_constraint
ALTER COLUMN field type[(size)]
DROP COLUMN field
DROP CONSTRAINT constraint
各車の状態に関する情報を格納する 10 文字のテキスト フィールドを追加するとします。 ノート レイアウト表示では、次の操作を行うことができます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
ALTER TABLE Cars ADD COLUMN Condition TEXT(10)
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
索引を作成する
既存のテーブルにインデックスを作成するには、CREATE INDEX コマンドを使用します。 CREATE INDEX コマンドの構文は次のとおりです。
CREATE [UNIQUE] INDEX index_name
ON table (field1 [DESC][, field2 [DESC], ...]) [WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]
必要な要素は、CREATE INDEX コマンド、インデックスの名前、ON 引数、インデックスを作成するフィールドを含むテーブルの名前、インデックスに含めるフィールドのリストだけです。
-
DESC 引数を使用すると、インデックスが降順で作成されます。これは、インデックス付きフィールドの上位の値を検索するクエリや、インデックス付きフィールドを降順で並べ替えるクエリを頻繁に実行する場合に便利です。 既定では、インデックスは昇順で作成されます。
-
WITH PRIMARY 引数は、インデックス付きフィールドまたはフィールドをテーブルの 主キー として確立します。
-
WITH DISALLOW NULL 引数を指定すると、インデックスがインデックス付きフィールドに値を入力する必要があります。つまり、null 値は許可されません。
購入を検討している中古車の名前、年、価格、条件を格納するフィールドを持つ Cars という名前のテーブルがあるとします。 また、テーブルが大きくなり、クエリに年フィールドを頻繁に含めるとします。 [年] フィールドにインデックスを作成すると、次の手順を使用して、クエリが結果をより迅速に返すことができます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
CREATE INDEX YearIndex ON Cars (Year)
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
制約またはリレーションシップを作成する
制約は、値の挿入時にフィールドまたはフィールドの組み合わせが満たす必要がある論理条件を確立します。 たとえば、UNIQUE 制約を使用すると、制約付きフィールドが、フィールドの既存の値を複製する値を受け入れなくなります。
リレーションシップは、フィールドの値または別のテーブル内のフィールドの組み合わせを参照して、制約付きフィールドに値を挿入できるか、フィールドの組み合わせに挿入できるかを判断する制約の一種です。 制約がリレーションシップであることを示すために特別なキーワードは使用しません。
制約を作成するには、CREATE TABLE または ALTER TABLE コマンドで CONSTRAINT 句を使用します。 CONSTRAINT 句には、1 つのフィールドに制約を作成するための句と、複数のフィールドに制約を作成する句の 2 種類があります。
単一フィールド制約
単一フィールド CONSTRAINT 句は、制約するフィールドの定義に直ちに従い、次の構文を持ちます。
CONSTRAINT constraint_name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreign_table [(foreign_field)] [ON UPDATE {CASCADE | SET NULL}] [ON DELETE {CASCADE | SET NULL}]}
購入を検討している中古車の名前、年、価格、条件を格納するフィールドを持つ Cars という名前のテーブルがあるとします。 また、車の状態の値を入力し忘れ、常にこの情報を記録するとします。 次の手順を使用して、[条件] フィールドに制約を作成して、フィールドを空のままにしないようにすることができます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
ここで、しばらくすると、[条件] フィールドには同じ値が多数あることがわかります。 たとえば、一部の車の条件値は 貧弱 で、他の車の値は 悪いです。
注: 残りの手順に従う場合は、前の手順で作成した Cars テーブルに偽のデータを追加します。
一貫性が高まるよう値をクリーンアップした後、CarCondition という名前のテーブルを作成し、"条件" という名前の 1 つのフィールドに、自動車の条件に使用するすべての値を含むを作成できます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
CREATE TABLE CarCondition (条件 TEXT(10))
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
-
ALTER TABLE ステートメントを使用して、テーブルの主キーを作成します。
ALTER TABLE CarCondition ALTER COLUMN Condition TEXT CONSTRAINT CarConditionPK PRIMARY KEY
-
Cars テーブルの [条件] フィールドの値を新しい CarCondition テーブルに挿入するには、[SQL ビュー オブジェクト] タブに次の SQL を入力します。
カーコンディショニングに挿入車から個別の条件を選択します。
注: この手順の SQL ステートメントは、 追加クエリです。 データ定義クエリとは異なり、追加クエリはセミコロンで終わります。
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
制約を使用してリレーションシップを作成する
Cars テーブルの [条件] フィールドに挿入された新しい値が CarCondition テーブルの [条件] フィールドの値と一致するように要求するには、次の手順に従って、Condition という名前のフィールドで CarCondition と Cars の間にリレーションシップを作成できます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition REFERENCES CarCondition (Condition)
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
複数フィールド制約
複数フィールド CONSTRAINT 句は、フィールド定義句の外部でのみ使用でき、次の構文があります。
CONSTRAINT constraint_name
{PRIMARY KEY (pk_field1[, pk_field2[, ...]]) | UNIQUE (unique1[, unique2[, ...]]) | NOT NULL (notnull1[, notnull2[, ...]]) | FOREIGN KEY [NO INDEX] (ref_field1[, ref_field2[, ...]]) REFERENCES foreign_table [(fk_field1[, fk_field2[, ...]])] | [ON UPDATE {CASCADE | SET NULL}] [ON DELETE {CASCADE | SET NULL}]}
Cars テーブルを使用する別の例を考えてみましょう。 Cars テーブル内の 2 つのレコードが、Name、Year、Condition、Price に同じ値セットを持たないようにするとします。 次の手順を使用して、これらのフィールドに適用される UNIQUE 制約を作成できます。
-
[作成] タブの [マクロとコード] グループで、[クエリ デザイン] をクリックします。
-
[ デザイン ] タブの [ クエリの種類 ] グループで、[ データ定義] をクリックします。
デザイン グリッドが非表示になり、[SQL ビュー オブジェクト] タブが表示されます。
-
次の SQL ステートメントを入力します。
ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (名前、年、条件、価格)
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。