この文は、データベースに新しいテーブルを作成するために使用します。また、オプションでリモート・サーバ上にもテーブルを作成できます。
CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name ( { column-definition | table-constraint | pctfree }, ... ) [ { IN | ON } dbspace-name ] [ ENCRYPTED ] [ ON COMMIT { DELETE | PRESERVE } ROWS | NOT TRANSACTIONAL ] [ AT location-string ] [ SHARE BY ALL ]
column-definition : column-name data-type [ COMPRESSED ] [ INLINE { inline-length | USE DEFAULT } ] [ PREFIX { prefix-length | USE DEFAULT } ] [ [ NO ] INDEX ] [ [ NOT ] NULL ] [ DEFAULT default-value | IDENTITY ] [ column-constraint ... ]
default-value : special-value | string | global variable | [ - ] number | ( constant-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | CURRENT DATABASE | CURRENT REMOTE USER | CURRENT UTC TIMESTAMP | GLOBAL AUTOINCREMENT [ ( partition-size ) ] | NULL | TIMESTAMP | UTC TIMESTAMP | LAST USER
special-value: CURRENT { DATE | TIME | TIMESTAMP | UTC TIMESTAMP | USER | PUBLISHER } | USER
column-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] | PRIMARY KEY [ CLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ action-list ] [ CLUSTERED ] } | [ CONSTRAINT constraint-name ] CHECK ( condition ) | COMPUTE ( expression )
table-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | CHECK ( condition ) | foreign-key-constraint }
foreign-key-constraint : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) ] REFERENCES table-name [ ( column-name, ... ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ action-list ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
action-list : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
location-string : remote-server-name.[db-name].[owner].object-name | remote-server-name;[db-name];[owner];object-name
pctfree : PCTFREE percent-free-space
percent-free-space : integer
IN 句 この句は、ベース・テーブルが格納される DB 領域を指定するときに使用します。この句が指定されていない場合、ベース・テーブルは default_dbspace オプションで指定された DB 領域に作成されます。
テンポラリ・テーブルはテンポラリ DB 領域だけに作成できます。GLOBAL TEMPORARY テーブルを作成するときに IN を指定すると、テーブルはテンポラリ DB 領域に作成されます。ユーザ定義の DB 領域を指定すると、エラーが返されます。
DB 領域の詳細については、次の項を参照してください。
ENCRYPTED 句 ENCRYPTED 句は、テーブルの暗号化が必要なときに使用します。テーブルを暗号化する場合、データベースの作成時にテーブルの暗号化を有効にする必要があります。その後、データベースの作成時に指定された暗号化キーとアルゴリズムを使用してテーブルが暗号化されます。データベース内のテーブル暗号化の有効化を参照してください。
ON COMMIT 句 ON COMMIT 句はテンポラリ・テーブル用にのみ使用します。デフォルトで、テンポラリ・テーブルのローは COMMIT のときに削除されます。SHARE BY ALL 句を指定する場合、ON COMMIT PRESERVE ROWS または NOT TRANSACTIONAL を指定する必要があります。
NOT TRANSACTIONAL 句 グローバル・テンポラリ・テーブルを作成するときに NOT TRANSACTIONAL 句を使用できます。NOT TRANSACTIONAL を使用して作成されたテーブルは、COMMIT または ROLLBACK の影響を受けません。SHARE BY ALL 句を指定する場合、ON COMMIT PRESERVE ROWS または NOT TRANSACTIONAL を指定する必要があります。NOT TRANSACTIONAL 句の利点については、テンポラリ・テーブルの操作を参照してください。
AT 句 location-string に指定された異なるサーバにリモート・テーブルを作成し、そのリモート・テーブルにマッピングするプロキシ・テーブルを現在のデータベース上に作成します。AT 句は、location-string のフィールド・デリミタとしてセミコロン (;) をサポートします。セミコロンがない場合は、ピリオドがフィールド・デリミタです。この構文を使用すると、データベースと所有者の各フィールドにファイル名と拡張子を使用できます。
たとえば、次の文は、テーブル a1 を Microsoft Access ファイル mydbfile.mdb にマッピングします。
CREATE TABLE a1 AT 'access;d:\mydbfile.mdb;;a1'; |
リモート・サーバの詳細については、CREATE SERVER 文を参照してください。プロキシ・テーブルの詳細については、CREATE EXISTING TABLE 文とプロキシ・テーブルのロケーションの指定を参照してください。
Windows Mobile は、AT 句をサポートしません。
外部キー定義は、リモート・テーブルでは無視されます。リモート・テーブルを参照するローカル・テーブルでの外部キー定義も無視されます。プライマリ・キー定義は、リモート・サーバにサポートされている場合、そのデータベース・サーバに送信されます。
SHARE BY ALL 句 この句を使用できるのは、グローバル・テンポラリ・テーブルを作成して、データベースに対するすべての接続でテーブルを共有する場合のみです。SHARE BY ALL 句を指定する場合、ON COMMIT PRESERVE ROWS または NOT TRANSACTIONAL を指定する必要があります。
テンポラリ・テーブルの特徴については、テンポラリ・テーブルの操作を参照してください。
IF NOT EXISTS 句 この句は、永久テーブル、グローバル・テンポラリ・テーブル、およびローカル・テンポラリ・テーブルを作成するときに使用します。指定された名前のテーブルがすでに存在する場合、変更は行われず、エラーは返されません。
テンポラリ・テーブルの特徴については、テンポラリ・テーブルの操作を参照してください。
column-definition テーブル内のカラムを定義します。次は、カラム定義の一部を示します。
column-name カラム名は識別子です。同じテーブル内の 2 つのカラムが同じ名前を持つことはできません。識別子を参照してください。
data-type カラムに格納されているデータ型。SQL データ型を参照してください。
COMPRESSED カラムを圧縮します。たとえば、次の文は filename と contents という 2 つのカラムがあるテーブル t を作成します。contents カラムは LONG BINARY であり、圧縮されています。
CREATE TABLE t ( filename VARCHAR(255), contents LONG BINARY COMPRESSED ); |
INLINE 句と PREFIX 句 INLINE 句は、ローに格納する最大 BLOB サイズをバイト単位で指定します。INLINE 句で指定された値以下のサイズの BLOB がローに格納されます。INLINE 句で指定された値を超えるサイズの BLOB は、ロー外のテーブル拡張ページに格納されます。また、BLOB のサイズが INLINE 句で指定された値より大きい場合、BLOB の先頭から数バイト分を複製してローに保持することができます。PREFIX 句は、ローに保持されるバイト数を指定します。ローの受け入れと拒否の判断に BLOB のプレフィクス・バイトを必要とする要求のパフォーマンスは、PREFIX 句によって向上する可能性があります。
圧縮されたカラムのプレフィクス・データは圧縮されずに格納されるため、要求を満たすために必要なすべてのデータがプレフィクス内に格納されている場合は、解凍は必要ありません。
INLINE と PREFIX のどちらも指定しない場合、または USE DEFAULT を指定している場合、デフォルト値は次のように適用されます。
CHAR、NCHAR、LONG VARCHAR などの文字データ型のカラムの場合、INLINE のデフォルト値は 256 で、PREFIX のデフォルト値は 8 です。
BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING、UUID など、バイナリ・データ型のカラムの場合、INLINE のデフォルト値は 256 であり、PREFIX のデフォルト値は 0 です。
デフォルト以外の設定が必要な特殊な環境でない限り、デフォルト値を使用するようにしてください。デフォルト値は、パフォーマンスとディスク領域の要件のバランスをとって選択されています。たとえば、INLINE に大きな値を設定し、すべての BLOB をインラインで格納するようにした場合、ローの処理パフォーマンスは低下することがあります。また、PREFIX の値を大きくしすぎると、BLOB の一部を複製したプレフィクス・データのために、BLOB の格納に必要なディスク領域のサイズが増えることになります。
値の 1 つのみを指定する場合、その他の値は指定した値と競合しない最大の値に自動的に設定されます。INLINE 値と PREFIX 値のどちらも、データベース・ページ・サイズを超えるサイズを指定できません。また、ロー・データの格納に使用できないテーブル・ページには、小さいサイズですが予約済みのオーバヘッドがあります。そのため、データベースのページ・サイズに近い INLINE 値を指定すると、やや少ないバイト数がインラインで格納される可能性があります。
INDEX 句と NO INDEX 句 BLOB の格納時に (文字型またはバイナリ型のみ)、BLOB サイズの内部しきい値 (約 8 データベース・ページ) を超える挿入値に対して BLOB インデックスを作成する場合は、INDEX を指定します。これはデフォルトの動作です。
BLOB インデックスは、BLOB 内のランダム・アクセス検索が必要なときにパフォーマンスを改善する可能性があります。ただし、ランダム・アクセスの必要がない画像ファイルやマルチメディア・ファイルなど、BLOB 値の種類によっては、BLOB インデックスをオフにするとパフォーマンスが改善されることがあります。カラムの BLOB インデックスをオフにするには、NO INDEX を指定します。
BLOB インデックスは、テーブル・インデックスとは異なります。テーブル・インデックスは、1 つ以上のカラムの値のインデックスとして作成されます。
NULL 句と NOT NULL 句 NULL が指定されると、カラムで NULL 値が許可されるようになります。これはデフォルトの動作です。
NOT NULL が指定されると、NULL 値は許可されません。
カラムが UNIQUE 制約または PRIMARY KEY 制約の一部である場合、NULL 句が指定されていても、そのようなカラムに NULL を含めることはできません。
DEFAULT 句 special-value の詳細については、特別値を参照してください。
DEFAULT 値を指定する場合、カラムの値を指定しない INSERT 文のカラムの値としてこのデフォルト値が使用されます。INSERT 文はカラムの値を指定しません。DEFAULT 値を指定しない場合、これは DEFAULT NULL と同じです。
DEFAULT に指定できる値を次に示します。
定数式 DEFAULT 句では、データベース・オブジェクトを参照していない定数式を使用できます。その結果、GETDATE や DATEADD などの関数を使用できます。式が関数または単純な値でない場合、カッコで囲みます。
CURRENT REMOTE USER SQL Remote Message Agent (dbremote) は、マニュアルに記載されていない REMOTE USER 文を実行すると、CURRENT REMOTE USER のデフォルトを設定します。値は、DBREMOTE からの接続の場合を除き、NULL になります。Message Agent (dbremote)を参照してください。
AUTOINCREMENT AUTOINCREMENT を使用する場合、カラムは整数データ型の 1 つ、または真数値型にします。
テーブルに挿入する場合、AUTOINCREMENT カラムの値を指定しないと、カラム内の任意の値より大きいユニーク値が生成されます。INSERT によって、カラムの現在の最大値よりも大きなカラム値を指定すると、その値は挿入され、以降の挿入時に開始ポイントとして使用されます。
ローを削除しても AUTOINCREMENT カウンタは減りません。ローの削除によって作成されたギャップは、挿入を行うときに明示的に割り当てることによってのみ埋めることができます。最大値未満のカラム値を明示的に挿入した後、明示的に割り当てられていない次のローを、以前の最大値より 1 大きい値を使ってオートインクリメントさせます。
カラムに直前に挿入された値は、グローバル変数 @@identity を調べることによって確認できます。@@identity グローバル変数を参照してください。
AUTOINCREMENT 値は、SYSTABCOL システム・ビューの max_identity カラムのデータ型に応じて、符号付き 64ビット整数として保持されます。生成された次の値が、AUTOINCREMENT が割り当てられたカラムに格納できる最大値を超えた場合は、NULL が返されます。NULL を入力できないように宣言されたカラムであると (プライマリ・キーのカラムである場合など)、SQL エラーが生成されます。
AUTOINCREMENT を使用するデータベースの再構築の詳細については、オートインクリメント・カラムのあるテーブルの再ロードを参照してください。
IDENTITY IDENTITY デフォルトは、AUTOINCREMENT デフォルトの使用に対する Transact-SQL 互換の代替手段です。SQL Anywhere では、IDENTITY として定義されるカラムは AUTOINCREMENT として実装されています。特殊な IDENTITY カラムを参照してください。
GLOBAL AUTOINCREMENT このデフォルトは、Mobile Link 同期環境または SQL Remote レプリケーションにおいて複数のデータベースを使用するときのために用意されたものです。
このオプションは AUTOINCREMENT と同じですが、ドメインはパーティションに分割されます。各分割には同じ数の値が含まれます。データベースの各コピーにユニークなグローバル・データベース ID 番号を割り当てます。SQL Anywhere では、データベースのデフォルト値は、そのデータベース番号でユニークに識別された分割からのみ設定されます。
AUTOINCREMENT キーワードの直後にカッコで分割サイズを指定できます。この分割サイズには任意の正の整数を設定できますが、通常、分割サイズは、サイズの値がすべての分割で不足しないように選択されます。
カラムの型が BIGINT または UNSIGNED BIGINT である場合、デフォルトの分割サイズは 232 = 4294967296 です。それ以外の型のカラムの場合、デフォルトの分割サイズは 216 = 65536 です。特に、カラムの型が INT または BIGINT ではない場合は、これらのデフォルト値が適切ではないことがあるため、分割サイズを明示的に指定するのが最も賢明です。
このデフォルトを使用する場合、各データベース内のパブリック・オプション global_database_id は、ユニークな正の整数に設定します。この値は、データベースをユニークに識別し、デフォルト値の割り当て元の分割を示します。使用できる値の範囲は np + 1 ~ p(n+ 1) です。ここで、n はパブリック・オプション global_database_id の値を表し、p は分割サイズを表します。たとえば、分割サイズを 1000、global_database_id を3 に設定すると、範囲は 3001 ~4000 になります。
前の値が p(n + 1) 未満であれば、このカラム内でこれまで使用した最大値より 1 大きい値が次のデフォルト値になります。カラムに値が含まれていない場合、最初のデフォルト値は np + 1 になります。デフォルトのカラム値は、現在の分割以外のカラムの値の影響を受けません。つまり、np + 1 より小さいか p(n + 1) より大きい数には影響されません。Mobile Link または SQL Remote 経由で別のデータベースからレプリケートした場合、このような値になることがあります。
カラムに直前に挿入された値は、グローバル変数 @@identity を調べることによって確認できます。
GLOBAL AUTOINCREMENT 値は、SYSTABCOL システム・ビューの max_identity カラムのデータ型に応じて、符号付き 64ビット整数として保持されます。NULL 値は、分割で値が不足したときにも生成されます。NULL を入力できないように宣言されたカラムであると (プライマリ・キーのカラムである場合など)、SQL エラーが生成されます。この場合には、別の分割からデフォルト値を選択できるように、データベースに global_database_id の新しい値を割り当ててください。未使用の値が残り少ないことを検出し、このような状態を処理するには、GlobalAutoincrement タイプのイベントを作成します。イベントの概要を参照してください。
public オプション global_database_id は、負の値に設定できないため、選択された値は常に正になります。ID 番号の最大値を制限するのは、カラム・データ・タイプと分割サイズだけです。
public オプション global_database_id がデフォルト値の 2147483647 に設定されると、NULL 値がカラムに挿入されます。NULL 値が許可されていない場合に、ローの挿入を試みるとエラーが発生します。
TIMESTAMP 句 テーブル内の各ローが最後に変更された日付を示すことができます。カラムの宣言に DEFAULT TIMESTAMP が指定されている場合は、ローを挿入するとタイムスタンプのデフォルト値が割り付けられます。この値は、ローが更新されるたびに現在の日付と時刻に基づいて更新されます。
挿入されたローにタイムスタンプのデフォルト値を割り付け、そのローが更新されてもタイムスタンプを更新しない場合は、DEFAULT TIMESTAMP の代わりに DEFAULT CURRENT TIMESTAMP を使用します。
タイムスタンプ・カラムの詳細については、Transact-SQL の特殊な timestamp カラムとデータ型を参照してください。
DEFAULT TIMESTAMP で宣言されたカラムにはユニークな値が入ります。これにより、アプリケーションは、ほぼ同時に行われた同じローの更新を検出できます。現在のタイムスタンプ値が直前の値と同じ場合は、default_timestamp_increment オプションの値が加えられます。default_timestamp_increment オプション [データベース] [Mobile Link クライアント]を参照してください。
default_timestamp_increment オプションに基づいて、SQL Anywhere のタイムスタンプ値を自動的にトランケートできます。これは、記録されるタイムスタンプ値の精度が低い他のデータベース・ソフトウェアとの互換性を維持する場合に便利です。default_timestamp_increment オプション [データベース] [Mobile Link クライアント]を参照してください。
グローバル変数 @@dbts は、DEFAULT TIMESTAMP を使用するカラムの最後に生成された値を表す TIMESTAMP 値を返します。グローバル変数を参照してください。
UTC TIMESTAMP 句 UTC TIMESTAMP の動作は TIMESTAMP と同じですが、UTC TIMESTAMP の値は協定世界時 (UTC) になる点が異なります。
string 文字列を参照してください。
global-variable グローバル変数を参照してください。
column-constraint 句と table-constraint 句 カラム制約とテーブル制約によってデータベース内のデータの整合性が保証されます。整合性制約の違反を起こす文は、実行が完了しません。このような文がエラー検出の前に行った変更は取り消され、エラーがレポートされます。作成できる制約のクラスは、「検査制約」と「参照整合性 (RI) 制約」の 2 つです。検査制約は、データベースに配置されているカラム値が満たす必要がある条件を指定するときに使用されます。RI 制約は、データに一意性の要件を指定するだけでなく、保守が必要な複数テーブルのデータ間に関係を確立します。
RI 制約には、プライマリ・キー、外部キー、一意性制約という 3 種類があります。RI 制約 (プライマリ・キー、外部キー、または一意性制約) を作成すると、データベース・サーバは、制約のキーを構築するカラムにインデックスを暗黙的に作成することで、制約を実行します。インデックスは指定した制約のキーに作成されます。キーは、順序付きリストのカラムと各カラムのシーケンス値 (ASC/DESC) で構成されます。
制約はカラムまたはテーブルに指定できます。一般的に、カラムの制約はテーブルの 1 つのカラムを指しますが、テーブルの制約はテーブル内の 1 つ以上のカラムを指します。
PRIMARY KEY 制約 プライマリ・キーはテーブルの各ローをユニークに定義します。プライマリ・キーは 1 つ以上のカラムで構成されます。1 つのテーブルに複数のプライマリ・キーが存在することがあります。column-constraint 句に PRIMARY KEY を指定すると、そのカラムはテーブルのプライマリ・キーになります。table-constraint で PRIMARY KEY 句を使用して、指定した順序で組み合わせてテーブルのプライマリ・キーを構築する 1 以上のカラムを指定します。
プライマリ・キーのカラムの順序は、カラムの順序と一致する必要はありません。つまり、プライマリ・キーのカラムは、ローの物理的な順序と同じになる必要はありません。また、重複するカラム名を指定することはできません。
プライマリ・キーを作成すると、キーのインデックスが自動的に作成されます。各カラムに ASC (昇順) または DESC (降順) を指定することで、インデックスの値の順序を指定できます。また、CLUSTERED キーワードを指定して、インデックスをクラスタ化するかどうかを指定することもできます。CLUSTERED オプションとクラスタード・インデックスの詳細については、クラスタード・インデックスの使用を参照してください。
プライマリ・キーに含まれるカラムには NULL を使用できません。テーブル内の各ローは、ユニークなプライマリ・キー値を持ちます。
プライマリ・キーには、FLOAT や DOUBLE などの概数値データ型を使用しないことをおすすめします。概数値データ型は、算術演算後の丸め誤差がでます。
外部キー 外部キーは、カラムのセットの値がプライマリ・キーの値、または別のテーブルの一意性制約 (プライマリ・テーブル) と一致するよう制限します。たとえば、外部キー制約を使って、請求書テーブルの顧客番号が顧客テーブルの顧客番号と確実に一致するようにできます。
データベース・サーバが外部キー用にカラムを自動的に選択する方法については、外部キー作成時でのカラム名の省略 (SQL の場合)を参照してください。
外部キー・カラムの順序は、テーブルのカラム順を反映する必要はありません。
外部キー指定では、カラム名の重複は許可されません。
UPDATE 操作または DELETE 操作にアクションが指定されていない場合、デフォルトの action は RESTRICT になります。
外部キーを作成すると、キーのインデックスが自動的に作成されます。各カラムに ASC (昇順) または DESC (降順) を指定することで、インデックスの値の順序を指定できます。また、CLUSTERED キーワードを指定して、インデックスをクラスタ化するかどうかを指定することもできます。CLUSTERED オプションとクラスタード・インデックスの詳細については、クラスタード・インデックスの使用を参照してください。
テンポラリ・テーブルは、ベース・テーブルを参照する外部キーを持つことはできません。また、ベース・テーブルも、テンポラリ・テーブルを参照する外部キーを持つことはできません。
NOT NULL オプション 外部キー・カラムを NULL 入力不可にします。外部キー内の NULL は、外部テーブルのこのローに該当するローがプライマリ・テーブル内にないことを意味します。
role-name 句 役割名は外部キーの名前です。役割名の主な機能は、同じテーブルに対する 2 つの外部キーを区別することです。役割名を指定しない場合、役割名は以下のように設定されます。
テーブル名と同じ役割名を含む外部キーが存在しない場合、テーブル名が役割名として割り当てられます。
テーブル名がすでに使用されている場合、役割名は、0 が埋め込まれた、テーブルに固有の 3 桁の数字と結合されたテーブル名になります。
REFERENCES 句 外部キー制約は、REFERENCES カラム制約または FOREIGN KEY テーブル制約を使用して実装できます。このとき、1 つ以上のカラムを指定できます。REFERENCES カラム制約に column-name を指定する場合、一意性制約またはプライマリ・キーの制約を受ける、プライマリ・テーブルのカラム名を指定します。また、この制約は、その 1 カラムだけで構成します。column-name を指定しない場合、外部キーはプライマリ・テーブルに含まれる単一のプライマリ・キーのカラムを参照します。
MATCH 句 MATCH 句を使用すると、複数列の外部キーを使用するときに一致と考えられる内容を制御することができます。また、キーの一意性を指定することで、一意性を別に宣言する必要がなくなります。次に、指定できる一致タイプを示します。
UNIQUE オプション 参照元テーブルには、NOT NULL キー値と一致する値が 1 つだけあります (1 つ以上の NOT NULL カラム値があるキーは暗黙的にユニークです)。
SIMPLE オプション 参照テーブルのローに一致が発生するのは、キーの 1 つ以上のカラムが NULL の場合、またはすべてのカラム値が参照先テーブルのローにある対応するカラムと一致する場合です。
FULL オプション 参照テーブルのローに一致が発生するのは、キーの 1 つ以上のカラムが NULL の場合、またはすべてのカラム値が参照先テーブルのローにある対応するカラムと一致する場合です。
SIMPLE UNIQUE オプション 一致が発生するのは、SIMPLE と UNIQUE の両方について基準を満たしている場合です。
FULL UNIQUE オプション 一致が発生するのは、FULL と UNIQUE の両方について基準を満たしている場合です。
UNIQUE 制約 column-constraint 句では、UNIQUE 制約はカラム値をユニークにする必要があることを示します。table-constraint 句では、UNIQUE 制約は、テーブル内の各ローをユニークに識別する 1 つ以上のカラムを指定します。テーブル内の異なるローが、指定されているすべてのカラムで同じ値を持つことはできません。1 つのテーブルは複数の UNIQUE 制約を持つことができます。
UNIQUE 制約はユニーク・インデックスとは異なります。ユニーク・インデックスのカラムは NULL でもかまいません。一方、UNIQUE 制約のカラムは NULL にはなりません。また、外部キーは、プライマリ・キーまたは UNIQUE 制約を参照できますが、ユニーク・インデックスは参照できません。ユニーク・インデックスは NULL の複数のインスタンスを含むことがあるからです。
UNIQUE 制約のカラムは、任意の順序で指定できます。また、各カラムに ASC (昇順) または DESC (降順) を指定することで、自動的に作成された対応するインデックスの値の順序を指定できます。ただし、カラム名を重複して指定することはできません。
一意性制約には、カラムに FLOAT や DOUBLE などの概数値データ型を使用しないことをおすすめします。概数値データ型は、算術演算後の丸め誤差がでます。
また、CLUSTERED キーワードを指定して、制約をクラスタ化するかどうかを指定することもできます。CLUSTERED オプションの詳細については、クラスタード・インデックスの使用を参照してください。
ユニーク・インデックスの詳細については、CREATE INDEX 文を参照してください。
CHECK 制約 この制約で、任意の条件を検証できます。たとえば、CHECK 制約を使うと、Sex というカラムには M または F の値だけが確実に入ります。
テーブルのどのローも CHECK 制約に違反することはできません。INSERT または UPDATE 文によってローが制約に違反する場合、操作は許可されず、この文の処理結果は取り消されます。変更は、CHECK 制約条件の評価結果が FALSE の場合にのみ拒否されます。CHECK 制約条件の評価結果が TRUE または UNKNOWN の場合、変更は許可されます。
COMPUTE 句 COMPUTE 句は、column-constraint 句にのみ使用します。カラムが COMPUTE 句を使って作成される場合、すべてのローの値は式で提供されます。この制約を付けて作成されたカラムは、読み込み専用カラムです。この値は、ローが変更されるたびにデータベース・サーバによって変更されます。COMPUTE 式は、非決定的な値を返しません。たとえば、CURRENT TIMESTAMP などの特別な値や非決定的関数は指定できません。COMPUTE 式が非決定的な値を返したとしても、それをクエリに含まれる式との一致に使用することはできません。計算カラムの使用を参照してください。
リモート・テーブルでは COMPUTE 句は無視されます。
計算カラムの値を変更しようとする UPDATE 文は、そのカラムに対応するトリガを起動します。
CHECK ON COMMIT オプション CHECKONCOMMIT オプションは wait_for_commit データベース・オプションを上書きします。この句を指定すると、データベース・サーバは COMMIT を待ってから外部キーに対する RESTRICT アクションをチェックします。CHECK ON COMMIT オプションは、CASCADE、SET NULL、SET DEFAULT アクションを遅延しません。
アクションを指定しないで CHECK ON COMMIT を使用すると、RESTRICT は、暗黙的に UPDATE と DELETE のアクションと見なされます。
FOR OLAP WORKLOAD オプション 外部キー定義の REFERENCES 句に FOR OLAP WORKLOAD を指定すると、データベース・サーバは特定の最適化を実行し、キーに関する統計情報を収集して、OLAP の負荷に関するパフォーマンスを向上させることができます。特に、optimization_workload を OLAP に設定すると有効です。optimization_workload オプション [データベース]を参照してください。
詳細については、OLAP のサポートを参照してください。
PCTFREE 句 各テーブル・ページに確保する空き領域の割合を指定します。空き領域は、データが更新されたときにローのサイズが増えた場合に使用されます。テーブル・ページに空き領域がない場合は、ページのローのサイズが増えるたびに、ローを複数のテーブル・ページに分割することが必要になり、ローの断片化が発生します。また、パフォーマンス低下の可能性があります。
percent-free-space の値は、0 ~ 100 までの整数です。0 を指定すると、各ページに空き領域を残さず、各ページを完全にパックします。高い値に設定すると、各ローは単独でページに挿入されます。PCTFREE が設定されない場合、または削除された場合、データベースのページ・サイズに応じたデフォルトの PCTFREE 値が適用されます (ページ・サイズが 4 KB 以上の場合は 200 バイト)。PCTFREE の値は、ISYSTAB システム・テーブルに格納されます。
CREATE TABLE 文は新しいテーブルを作成します。所有者名を指定することにより、別のユーザに対するテーブルを作成できます。GLOBAL TEMPORARY を指定すると、テーブルはテンポラリ・テーブルと見なされます。指定しないと、テーブルはベース・テーブルとなります。
CREATE TABLE 文のテーブル名の前にシャープ記号 (#) を付けてテーブルを作成すると、テンポラリ・テーブルが宣言されます。テンポラリ・テーブルは現在の接続でのみ使用できます。シャープ記号 (#) を使用して作成されたテンポラリ・テーブルは、ON COMMIT PRESERVE ROWS 句を使用して作成されたテーブルと同じです。DECLARE LOCAL TEMPORARY TABLE 文を参照してください。
SQL Anywhere のカラムはデフォルトで NULL を許容しています。この設定は、allow_nulls_by_default データベース・オプションを使用して制御できます。allow_nulls_by_default オプション [互換性]を参照してください。
RESOURCE 権限が必要です。
別のユーザのテーブルを作成するには、DBA 権限が必要です。
オートコミット。
SQL/2003 コア機能。
次はベンダ拡張です。
{ IN | ON } dbspace-name 句
ON COMMIT 句
いくつかのデフォルト値
次の例は、図書データベース用にテーブルを作成し、図書情報を保持します。
CREATE TABLE library_books ( -- NOT NULL is assumed for primary key columns isbn CHAR(20) PRIMARY KEY, copyright_date DATE, title CHAR(100), author CHAR(50), -- column(s) corresponding to primary key of room -- are created automatically FOREIGN KEY location REFERENCES room ); |
次の例では、図書データベース用にテーブルを作成して、借し出し図書の情報を保持します。date_borrowed のデフォルト値は、エントリが作成される日に本が貸し出されることを示します。date_returned カラムは、本が返却されるまでは NULL です。
CREATE TABLE borrowed_book ( date_borrowed DATE NOT NULL DEFAULT CURRENT DATE, date_returned DATE, book CHAR(20) REFERENCES library_books (isbn), -- The check condition is UNKNOWN until -- the book is returned, which is allowed CHECK( date_returned >= date_borrowed ) ); |
次の例は、販売データベース用にテーブルを作成し、注文と注文項目情報を保持します。
CREATE TABLE Orders ( order_num INTEGER NOT NULL PRIMARY KEY, date_ordered DATE, name CHAR(80) ); CREATE TABLE Order_item ( order_num INTEGER NOT NULL, item_num SMALLINT NOT NULL, PRIMARY KEY ( order_num, item_num ), -- When an order is deleted, delete all of its -- items. FOREIGN KEY ( order_num ) REFERENCES Orders ( order_num ) ON DELETE CASCADE ); |
次の例は、リモート・サーバ SERVER_A にテーブル t1 を作成し、このリモート・テーブルにマッピングするプロキシ・テーブル t1 を作成します。
CREATE TABLE t1 ( a INT, b CHAR(10) ) AT 'SERVER_A.db1.joe.t1'; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |