Access SQL を使用してテーブルのデザインを変更する

テーブルを作成してデータを入力した後で、テーブルの設計変更が必要になる場合があります。 そのためには、 ALTER TABLE ステートメントを使用します。 既存のテーブルの構造を変更すると、一部のデータが失われる可能性があるので注意してください。 たとえば、フィールドのデータ型を変更すると、データ型によってはデータの消失、丸めエラーなどの結果に至る可能性があります。 また、変更されるフィールドをアプリケーションの他の部分が参照している場合、その部分にも悪影響が及ぶ可能性があります。 既存のテーブルの構造を変更するときは常に、事前に十分な検討を行ってから作業するようにしてください。

ALTER TABLE ステートメントを使用すると、列 (またはフィールド) を追加、削除、または変更でき、制約を追加または削除できます。 フィールドの既定値を宣言することもできます。ただし、一度に変更できるフィールドは 1 つだけです。 請求データベースがあり、Customers テーブルにフィールドを追加するとします。 ALTER TABLE ステートメントを使用してフィールドを追加するには、必要に応じて、フィールドの名前、そのデータ型、およびデータ型のサイズを含む ADD COLUMN 句を使用します。

ALTER TABLE tblCustomers 
   ADD COLUMN Address TEXT(30) 

フィールドのデータ型またはサイズを変更するには、フィールドの名前、変更後のデータ型、および変更後のデータ型のサイズ (必要な場合) を指定して ALTER COLUMN 句を使用します。

ALTER TABLE tblCustomers 
   ALTER COLUMN Address TEXT(40) 

フィールドの名前を変更する場合は、フィールドを削除してから再作成する必要があります。 フィールドを削除するには、フィールド名だけを指定して DROP COLUMN 句を使用します。

ALTER TABLE tblCustomers 
   DROP COLUMN Address 

このメソッドを使用すると、フィールドの既存のデータが削除されることに注意してください。 既存のデータを保持するには、Access ユーザー インターフェイスのテーブル デザイン モードでフィールドの名前を変更するか、現在のデータを一時テーブルに保持し、名前を変更したテーブルに追加するコードを記述する必要があります。 既定値は、新しいレコードが追加され、その特定の列に値が指定されていないときにフィールドに入力される値です。 フィールドの既定値を設定するには、ADD COLUMN 句または ALTER COLUMN 句でフィールドのデータ型を宣言した後に、DEFAULT キーワードを使用します。

ALTER TABLE tblCustomers 
   ALTER COLUMN Address TEXT(40) DEFAULT Unknown 

既定値は一重引用符で囲まれないことに注意してください。 囲まれていると、一重引用符も含めてレコードに挿入されてしまいます。 DEFAULT キーワードは、CREATE TABLE ステートメントでも使用できます。

CREATE TABLE tblCustomers ( 
   CustomerID INTEGER CONSTRAINT PK_tblCustomers 
      PRIMARY KEY, 
   [Last Name] TEXT(50) NOT NULL, 
   [First Name] TEXT(50) NOT NULL, 
   Phone TEXT(10), 
   Email TEXT(50), 
   Address TEXT(40) DEFAULT Unknown) 

注:

DEFAULT ステートメントは、Access OLE DB プロバイダーおよび ADO 経由でのみ実行できます。 Access の [SQL ビュー] ユーザー インターフェイスからこのステートメントを使用すると、エラー メッセージが返されます。

制約

制約条件を使用することで、主キーと参照整合性を確立したり、フィールドに挿入できる値を制限することができます。 一般に、制約条件は、データベース内のデータの整合性と一貫性の維持に使用されます。

制約には、単一フィールド (フィールド レベル) 制約と複数フィールド (テーブル レベル) 制約の 2 種類があります。 どちらの種類の制約も、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントで使用できます。

列レベル制約とも呼ばれる単一フィールド制約は、フィールド自体と共に、フィールドおよびデータ型の宣言よりも後に宣言されます。 この例では、[Customers] テーブルを使用し、[CustomerID] フィールドに単一フィールド主キーを作成します。 制約を追加するには、CONSTRAINT キーワードをフィールドの名前と共に使用します。

ALTER TABLE tblCustomers 
   ALTER COLUMN CustomerID INTEGER 
   CONSTRAINT PK_tblCustomers PRIMARY KEY 

制約条件に名前が付けられていることに注意してください。 CONSTRAINT 句全体を省略する主キーの宣言には、ショートカットを使用できます。

ALTER TABLE tblCustomers 
   ALTER COLUMN CustomerID INTEGER PRIMARY KEY 

ただし、ショートカットを使用する場合、Access は制約条件名をランダムに生成するため、コードで参照することが困難になります。 制約に常に名前を付けるのが良い考えです。

制約条件を解除するには、ALTER TABLE ステートメントに DROP CONSTRAINT 句を設定し、制約条件名を指定します。

ALTER TABLE tblCustomers 
   DROP CONSTRAINT PK_tblCustomers 

制約はフィールドに入力可能な値を制限する用途にも使用できます。 値に NOT NULL または UNIQUE 制約を適用したり、フィールドに適用可能なビジネス ルールの一種であるチェック制約を定義したりできます。 たとえば、姓と名のフィールド値の組み合わせが一意でなければならない、すなわち、姓と名の組み合わせが同一であるレコードが 2 つ以上テーブルに存在してはならない、という制約を設けることを考えます。 これは複数フィールド制約であるため、フィールド レベルではなくテーブル レベルで宣言します。 ADD CONSTRAINT 句を使用し、複数フィールドのリストを定義します。

ALTER TABLE tblCustomers 
   ADD CONSTRAINT CustomerID UNIQUE 
   ([Last Name], [First Name]) 

チェック制約は、1 つのフィールドを参照できる式、または 1 つ以上のテーブルにまたがる複数のフィールドを参照できる式を作成することで、テーブルにデータ検証を追加できる強力な SQL 機能です。 請求書レコードに入力された金額が常に $0.00 を超えるようにするとします。 そのためには、ALTER TABLE ステートメントの ADD CONSTRAINT 句で CHECK キーワードと検証式を宣言して、check 制約を使用します。

ALTER TABLE tblInvoices 
   ADD CONSTRAINT CheckAmount 
   CHECK (Amount > 0) 

チェック制約を定義するために使用される式は、同じテーブル内の複数のフィールドを参照したり、他のテーブルのフィールドを参照したり、 SELECT ステートメント、算術演算子、集計関数など、Microsoft Access SQL で有効な操作を使用することもできます。 チェック制約を定義する式の長さは 64 文字を超えてはなりません。

得意先を [Customers] テーブルに追加する前に、各得意先の信用限度額をチェックしたいとします。 ALTER TABLE ステートメントを ADD COLUMN 句および CONSTRAINT 句と共に使用して、CreditLimit テーブル内の値を参照して得意先の信用限度額を確認する制約を作成します。 使用する以下の SQL ステートメントでは、tblCreditLimit テーブルを作成し、tblCustomers テーブルに CustomerLimit フィールドを追加し、tblCustomers テーブルにチェック制約を追加し、チェック制約をテストします。

CREATE TABLE tblCreditLimit ( 
   Limit DOUBLE) 
 
INSERT INTO tblCreditLimit 
   VALUES (100) 
 
ALTER TABLE tblCustomers 
   ADD COLUMN CustomerLimit DOUBLE 
 
ALTER TABLE tblCustomers 
   ADD CONSTRAINT LimitRule 
   CHECK (CustomerLimit <= (SELECT Limit 
      FROM tblCreditLimit)) 
 
UPDATE TABLE tblCustomers 
   SET CustomerLimit = 200 
   WHERE CustomerID = 1 

UPDATE TABLE ステートメントを実行すると、check 制約に違反したため、更新が成功しなかったことを示すメッセージが表示されます。 CustomerLimit フィールドの値を 100 以下に変更すると、更新は成功するようになります。

連鎖更新と連鎖削除

制約を使用して、データベース テーブル間の参照整合性を確立することもできます。 参照整合性があることは、データに一貫性があり、データが破損していないことを意味します。 たとえば、得意先レコードを削除したがその得意先の出荷レコードがデータベースに残っている場合、出荷テーブルに残ったレコードが孤立化し、データに矛盾が発生します。 参照整合性は、テーブル間にリレーションシップを構築した時点で確立されます。

参照整合性の確立に加えて、連鎖更新と連鎖削除を使用することにより、参照先テーブル内のレコードが同期を保っていることを保証できます。 たとえば、連鎖更新と連鎖削除が宣言されているとき、得意先レコードを削除すると、その得意先の出荷レコードも自動的に削除されます。

連鎖更新と連鎖削除を有効にするには、ALTER TABLE ステートメントの CONSTRAINT 句で ON UPDATE CASCADE キーワードまたは ON DELETE CASCADE キーワード (あるいは両方) を使用します。 それらは外部キーに適用される必要があることに注意してください。

ALTER TABLE tblShipping 
   ADD CONSTRAINT FK_tblShipping 
   FOREIGN KEY (CustomerID) REFERENCES 
      tblCustomers (CustomerID) 
   ON UPDATE CASCADE 
   ON DELETE CASCADE 

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。