発掘 Jet データベースエンジンに対して common Data Definition Language (DDL) SQL ステートメントを使用する方法

#発掘する趣旨
 https://docs.microsoft.com/ja-jp/office/troubleshoot/access/how-to-use-common-ddl-sql-statements 
9月30日まで公開されていたらしいのだが、突如として削除されて閲覧できない。
https://support.microsoft.com/ja-jp/help/180841/how-to-use-common-data-definition-language-ddl-sql-statements-for-the
ところが同趣旨のものが上記のURLに上がっている。しかし、一部のコードはコード枠として囲まれていない。

##微妙に異なる概要
さらに概要が

>この記事では、Microsoft Jet データベースエンジンの一般的な DDL (データ定義言語) SQL ステートメントの一部について説明します。 

以前は
>この記事では、Microsoft Jet データベースエンジンのいくつかの一般的な DDL (データ定義言語) SQL ステートメントについて説明します。

とこのように微妙に表現が変わっている。自動翻訳が原因か。それとも意味があるのか謎である

##差異が不明
なぜそういう扱いをするのかが不明である。
この変化以外に差があるのかが不明である。

##削除されたページにヒットしてしまう
さらに検索すると削除したページがヒットしてしまう。もし上記のURLで見つからない場合はここを見つけて新しいサイトを見てほしい。

##重要なページ
このページには重要な記載がある。
>Microsoft Access DDL SQL ステートメントを使用して、"オートナンバーレプリケーション"、"ハイパーリンク"、または "Lookup" 型フィールドを作成することはできません。 

つまりアクションクエリ、SQLによって、上記の3つのタイプのフィールドはCreateTableなどではできないという根拠が明瞭に示されている。
ただし、オートナンバーレプリケーションはあまり使われない。またハイパーリンクはMEMO（LONGERTEXT）で作り、あとから属性を加える。データ型の変更はSQLではできないが、手動、あるいはAccessのVBAで可能である。またルックアップ型はYesNo,Bit型であるため、それを作ってルックアップ属性を付与すると良い。

#Jet データベースエンジンに対して common Data Definition Language (DDL) SQL ステートメントを使用する方法
2020/09/30
#####適用対象:
Access for Office 365, Access 2019, Access 2016, Access 2013, Access 2010, Access 2007, Access 2003
元の KB 番号:   180841
##概要

この記事では、Microsoft Jet データベースエンジンのいくつかの一般的な DDL (データ定義言語) SQL ステートメントについて説明します。
##詳細情報
Microsoft Jet は、Microsoft Access データベースファイル内のテーブル、インデックス、およびリレーションシップを作成、変更、および削除するために使用できる、データ定義言語 SQL ステートメントの完全なセットを提供します。 この DDL を MFC データベースクラスと共に使用して、Access データベースを操作できます。 この記事では、この種類の SQL ステートメントの一般的な例を示します。

この記事では、次の構文を使用して DDL ステートメントを1つ実行できます。

```cpp
// Open database file.
CDaoDatabase db;
db.Open(_T("C:\\MyDatabase.mdb"));

// Set strSQL to desired DDL statement.
CString strSQL;
strSQL = _T("CREATE TABLE Simple (ID long)");

// Execute DDL statement.
try {
  db.Execute(strSQL, dbFailOnError);
} catch (CDaoException * e) {
  // Display errors (simple example).
  AfxMessageBox(e -> m_pErrorInfo -> m_strDescription,
    MB_ICONEXCLAMATION);
  e -> Delete();
}
```

この記事では、次の構文を使用して DDL ステートメントを実行することができます (MFC ODBC クラスを使用)。

```cpp

// Open database file.
CDatabase db;
db.OpenEx(_T("DSN=MyAccessDB"), CDatabase::noOdbcDialog);

// Set strSQL to desired DDL statement.
CString strSQL;
strSQL = _T("CREATE TABLE Simple (ID long)");

// Execute DDL statement.
try {
  db.ExecuteSQL(strSQL);
} catch (CDBException * e) {
  // Display errors (simple example).
  AfxMessageBox(e -> m_strError,
    MB_ICONEXCLAMATION);
  e -> Delete();
}

```

###CREATE TABLE DDL ステートメント

次の create table ステートメントは、Microsoft Access データ型で使用可能なすべての DDL を使用してテストテーブルを作成します。

```sql
CREATE TABLE TestAllTypes ( MyText TEXT(50), MyMemo MEMO, MyByte BYTE, MyInteger INTEGER, MyLong LONG, MyAutoNumber COUNTER, MySingle SINGLE, MyDouble DOUBLE, MyCurrency CURRENCY, MyReplicaID GUID, MyDateTime DATETIME, MyYesNo YESNO, MyOleObject LONGBINARY, MyBinary BINARY(50))
```

####注意

Microsoft Access DDL SQL ステートメントを使用して、"オートナンバーレプリケーション"、"ハイパーリンク"、または "Lookup" 型フィールドを作成することはできません。 これらのフィールドの種類は、ネイティブの Jet フィールド型ではなく、Microsoft Access のユーザーインターフェイスでのみ作成および使用できます。 上記の MyBinary フィールドは、Microsoft Access ユーザーインターフェイスを介して作成することはできませんが、SQL DDL ステートメントを使用して作成できる特殊な固定長のバイナリフィールドです。

単一の DDL ステートメントを使用して、単一フィールドの主キーを持つテーブルを作成できます。 次のステートメントは、PK_MyID という名前の MyID フィールドに主キーを持つ TestPrimaryKey という名前のテーブルを作成します。

```sql
CREATE TABLE TestPrimaryKey ( MyID LONG CONSTRAINT PK_MyID PRIMARY KEY, FirstName TEXT(20), LastName TEXT(20))
```

###ALTER TABLE DDL ステートメント

Microsoft Access DDL は、ALTER TABLE DDL ステートメントをサポートしています。 このステートメントは、既存のテーブルに対してフィールドを削除または追加する必要がある場合に便利です。

####注意

このステートメントでは、Access のテーブル内の既存のフィールド (たとえば、フィールドのデータ型を変更する) を変更することはできません。

次の DDL は、テーブル TooManyFields から、MoreInfo という名前の列を削除します。

```sql
ALTER TABLE TooManyFields DROP COLUMN MoreInfo
```

次の DDL ステートメントでは、NotEnoughFields という名前のテーブルに、ExtraInfo という名前の列を追加します。

```sql
ALTER TABLE NotEnoughFields ADD COLUMN ExtraInfo Text(255)
```

ALTER TABLE ステートメントを使用して、2つのテーブル間のリレーションシップを作成することもできます。

次の SQL ステートメントでは、2つのテーブル (CarsとColors) を作成してから、[ColorId] フィールドの "car テーブル" と "Colors/色" テーブルの間にリレーションシップを作成します (各 car には1つの色しか設定できません)。

####注意

3つの個別の DDL ステートメントがあります。これは、一度に1つずつ実行する必要があります。

```sql
CREATE TABLE Cars ( CarID LONG, CarName TEXT(50), ColorID LONG ) CREATE TABLE Colors ( ColorID LONG CONSTRAINT PK_Colors PRIMARY KEY, ColorName TEXT(50)) ALTER TABLE Cars ADD CONSTRAINT MyColorIDRelationship FOREIGN KEY (ColorID) REFERENCES Colors (ColorID)
```
#### 編注 Accessは1つのアクションクエリで1つのCreateTableしか実行できない。
このため次の3つに分割しなければならず、末尾にセミコロンが必要となる。

```sql
CREATE TABLE Cars ( CarID LONG, CarName TEXT(50), ColorID LONG );
```

```sql
CREATE TABLE Colors ( ColorID LONG CONSTRAINT PK_Colors PRIMARY KEY, ColorName TEXT(50));
```


```sql
ALTER TABLE Cars ADD CONSTRAINT MyColorIDRelationship FOREIGN KEY (ColorID) REFERENCES Colors (ColorID);
```

3つのアクションクエリを作成し、上から順に実行する。原文は末尾のセミコロンがないが、実際は必要なので注意。原文がなぜ3つまとめているのか正直趣旨を測りかねる。



####注意

[連鎖更新] または [連鎖削除] を使用して、DDL を使用して作成されたリレーションシップを指定することはできません。 これらの機能は、Microsoft DAO (データアクセスオブジェクト) インターフェイスをコード経由で使用する場合、または Microsoft Access ユーザーインターフェイスを使用する場合にのみ使用できます。
###CREATE INDEX DDL ステートメント

CREATE INDEX DDL ステートメントは、既存のテーブルに追加のインデックスを作成するために使用されます。

次の DDL ステートメントでは、MyStateIndex という名前の一意でない1つの昇順のインデックスが、テーブルのアドレスのフィールドの状態に追加されます。

```Sql
CREATE INDEX MyStateIndex
ON Addresses ( State ASC )
```

次の DDL ステートメントでは、MyFullNameIndex という名前の2つのフィールドの一意の昇順のインデックスが、テーブルのアドレスの FirstName フィールドと LastName に追加されます。

```Sql
CREATE UNIQUE INDEX MyFullNameIndex
ON Addresses ( FirstName ASC, LastName ASC )
```

CREATE TABLE DDL ステートメントを使用して、NULL を許可しない追加の制約を指定することもできます。 NULL を許可しないことを指定すると、null 値を持つフィールドをインデックス内の任意の列に挿入できなくなります。

次の DDL ステートメントは、表 HRInfo のフィールド Salary に MySalaryIndex という名前の単一フィールドの一意な降順のインデックスを作成します。

```sql
CREATE UNIQUE INDEX MySalaryIndex
ON HRInfo ( Salary DESC ) WITH DISALLOW NULL
```

このインデックスを使用すると、すべてのレコードに Salary フィールドの値を設定する必要があります。

###DROP DDL ステートメント

DROP DDL ステートメントを使用して、既存のテーブルまたはインデックスを削除します。
次の DDL ステートメントは、TempTable という名前のテーブルを完全に削除します。

```sql
DROP TABLE TempTable
```

次の DDL ステートメントは、テーブル OverIndexedTable 上の Myallowused Index という名前のインデックスを完全に削除します。

```SQL
DROP INDEX MyUnusedIndex ON OverIndexedTable
```

##関連情報

Microsoft Jet DDL 構文の詳細については、「Microsoft Jet データベースエンジンプログラマーズガイド、Second Edition、第3章、「データ定義と整合性」を参照してください。