データベースに新しいテーブルを作成し、オプションでリモートサーバ上にテーブルを作成します。
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 ) | ( sequence-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | GLOBAL AUTOINCREMENT [ ( partition-size ) ]
special-value : CURRENT DATABASE | CURRENT DATE | CURRENT TIME | [ CURRENT ] TIMESTAMP | CURRENT PUBLISHER | CURRENT REMOTE USER | [ CURRENT ] USER | [ CURRENT ] UTC TIMESTAMP | LAST USER | NULL
column-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] | PRIMARY KEY [ CLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ action-list ] [ CLUSTERED ] | 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 領域を指定すると、エラーが返されます。
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 を指定する必要があります。
AT 句 location-string に指定された異なるサーバにリモートテーブルを作成し、そのリモートテーブルにマッピングするプロキシテーブルを現在のデータベース上に作成します。AT 句は、location-string のフィールドデリミタとしてセミコロン (;) をサポートします。セミコロンがない場合は、ピリオドがフィールドデリミタです。この構文を使用すると、データベースと所有者の各フィールドにファイル名と拡張子を使用できます。
たとえば次の文は、テーブル proxy_Customers を、架空の Microsoft Access データベースである MyAccessDB の新しいテーブル Customers にマッピングします。
CREATE TABLE proxy_Customers ( ID INTEGER CONSTRAINT PRIMARY KEY, ClientName TEXT, ClientAddress TEXT, Telephone TEXT ) AT 'MyAccessDB;;;Customers'; |
AT 句内の文字列に、カッコで囲んだローカル変数名またはグローバル変数名を入れることもできます ({variable-name})。SQL 変数名は、CHAR、VARCHAR、または LONG VARCHAR のデータ型にする必要があります。たとえば、'access;{@myfile};;a1'
を含む AT 句は、@myfile が SQL 変数で、@myfile 変数の現在の内容がプロキシテーブルの作成時に置き換えられることを示します。
Windows Mobile は、AT 句をサポートしません。
外部キー定義は、リモートテーブルでは無視されます。リモートテーブルを参照するローカルテーブルでの外部キー定義も無視されます。プライマリキー定義は、リモートサーバにサポートされている場合、そのデータベースサーバに送信されます。
SHARE BY ALL 句 この句を使用できるのは、グローバルテンポラリテーブルを作成して、データベースに対するすべての接続でテーブルを共有する場合のみです。SHARE BY ALL 句を指定する場合、ON COMMIT PRESERVE ROWS または NOT TRANSACTIONAL を指定する必要があります。
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 値が許可されるようになります。これはデフォルトの動作です。この設定は、allow_nulls_by_default データベースオプションを使用して制御します。
デフォルトで、BIT として宣言されているカラムは NULL 入力不可ですが、明示的に NULL 入力可にすることができます。
NOT NULL が指定されると、NULL 値は許可されません。
カラムが UNIQUE 制約または PRIMARY KEY 制約の一部である場合、NULL 句が指定されていても、そのようなカラムに NULL を含めることはできません。
DEFAULT 句 DEFAULT 値を指定する場合、カラムの値を指定しない INSERT 文のカラムの値としてこのデフォルト値が使用されます。INSERT 文はカラムの値を指定しません。DEFAULT 値を指定しない場合、これは DEFAULT NULL と同じです。
DEFAULT に指定できる値を次に示します。
[ CURRENT ] TIMESTAMP テーブル内の各ローが最後に変更された日付を示すことができます。カラムの宣言に DEFAULT TIMESTAMP が指定されている場合は、ローを挿入するとタイムスタンプのデフォルト値が割り付けられます。この値は、ローが更新されるたびに現在の日付と時刻に基づいて更新されます。
挿入されたローにタイムスタンプのデフォルト値を割り付け、そのローが更新されてもタイムスタンプを更新しない場合は、DEFAULT TIMESTAMP の代わりに DEFAULT CURRENT TIMESTAMP を使用します。
DEFAULT TIMESTAMP で宣言されたカラムにはユニークな値が入ります。これにより、アプリケーションは、ほぼ同時に行われた同じローの更新を検出できます。現在の TIMESTAMP 値が直前の値と同じ場合は、default_timestamp_increment オプションの値が加えられます。
default_timestamp_increment オプションに基づいて、SQL Anywhere の TIMESTAMP 値を自動的にトランケートできます。これは、記録されるタイムスタンプ値の精度が低い他のデータベースソフトウェアとの互換性を維持する場合に便利です。
グローバル変数 @@dbts は、DEFAULT TIMESTAMP を使用するカラムの最後に生成された値を表す TIMESTAMP 値を返します。
[ CURRENT ] UTC TIMESTAMP テーブル内の各ローが最後に変更された日付を示すことができます。カラムの宣言に DEFAULT UTC TIMESTAMP が指定されている場合は、ローを挿入するとタイムスタンプのデフォルト値が割り付けられます。この値は、ローが更新されるたびに現在の協定世界時 (UTC: Coordinated Universal Time) に基づいて更新されます。
挿入されたローにタイムスタンプのデフォルト値を割り付け、そのローが更新されてもタイムスタンプを更新しない場合は、DEFAULT UTC TIMESTAMP の代わりに DEFAULT CURRENT UTC TIMESTAMP を使用します。
このデフォルトの動作は TIMESTAMP や CURRENT TIMESTAMP と同じですが、日付と時刻が協定世界時 (UTC: Coordinated Universal Time) になる点が異なります。
string 文字列を参照してください。
global-variable グローバル変数を参照してください。
constant-expression DEFAULT 句では、データベースオブジェクトを参照していない定数式を使用できます。その結果、GETDATE や DATEADD などの関数を使用できます。式が関数または単純な値でない場合、カッコで囲みます。
sequence-expression データベース内のシーケンスの現在の値または次の値に、DEFAULT を設定できます。
AUTOINCREMENT AUTOINCREMENT を使用する場合、カラムは整数データ型の 1 つ、または真数値型にします。
テーブルに挿入する場合、AUTOINCREMENT カラムの値を指定しないと、カラム内の任意の値より大きいユニーク値が生成されます。INSERT によって、カラムの現在の最大値よりも大きなカラム値を指定すると、その値は挿入され、以降の挿入時に開始ポイントとして使用されます。
ローを削除しても AUTOINCREMENT カウンタは減りません。ローの削除によって作成されたギャップは、挿入を行うときに明示的に割り当てることによってのみ埋めることができます。最大値未満のカラム値を明示的に挿入した後、明示的に割り当てられていない次のローを、以前の最大値より 1 大きい値を使ってオートインクリメントさせます。
カラムに直前に挿入された値は、グローバル変数 @@identity を調べることによって確認できます。
AUTOINCREMENT 値は、SYSTABCOL システムビューの max_identity カラムのデータ型に応じて、符号付き 64ビット整数として保持されます。生成された次の値が、AUTOINCREMENT が割り当てられたカラムに格納できる最大値を超えた場合は、NULL が返されます。NULL を入力できないように宣言されたカラムであると (プライマリキーのカラムである場合など)、SQL エラーが生成されます。
カラムに使用する次の値は、sa_reset_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 値が許可されていない場合に、ローの挿入を試みるとエラーが発生します。
カラムに使用する次の値は、sa_reset_identity プロシージャを使用してリセットできます。
LAST USER LAST USER は、ローを最後に変更したユーザのユーザ ID です。
LAST USER は文字データ型のカラムでデフォルト値として使用できます。
INSERT の場合、このデフォルトは CURRENT USER と同じ効果があります。
UPDATE では、LAST USER のデフォルトを持つカラムが明示的に変更されていなければ、現在のユーザ名に変更されます。
DEFAULT TIMESTAMP または DEFAULT UTC TIMESTAMP とともに使用すると、LAST USER のデフォルトを使用して、ローを最後に変更したユーザと日時の両方を記録できます (ただし、別々のカラムに記録されます)。
IDENTITY 句 IDENTITY は、DEFAULT AUTOINCREMENT の使用に対する Transact-SQL 互換の代替手段です。SQL Anywhere では、IDENTITY を指定して定義されたカラムは DEFAULT AUTOINCREMENT として実装されます。
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 キーワードを指定して、インデックスをクラスタ化するかどうかを指定することもできます。
プライマリキーに含まれるカラムには NULL を使用できません。テーブル内の各ローは、ユニークなプライマリキー値を持ちます。
プライマリキーには、FLOAT や DOUBLE などの概数値データ型を使用しないことをおすすめします。概数値データ型は、算術演算後の丸め誤差がでます。
プライマリキーには空間カラムは設定できません。
FOREIGN KEY 句 外部キーは、カラムのセットの値がプライマリキーの値、または別のテーブルの一意性制約 (プライマリテーブル) と一致するよう制限します。たとえば、外部キー制約を使って、請求書テーブルの顧客番号が顧客テーブルの顧客番号と確実に一致するようにできます。
外部キーカラムの順序は、テーブルのカラム順を反映する必要はありません。
外部キー指定では、カラム名の重複は許可されません。
UPDATE 操作または DELETE 操作にアクションが指定されていない場合、デフォルトの action は RESTRICT になります。
外部キーを作成すると、キーのインデックスが自動的に作成されます。各カラムに ASC (昇順) または DESC (降順) を指定することで、インデックスの値の順序を指定できます。また、CLUSTERED キーワードを指定して、インデックスをクラスタ化するかどうかを指定することもできます。
グローバルテンポラリテーブルは、ベーステーブルを参照する外部キーを持つことはできません。また、ベーステーブルも、グローバルテンポラリテーブルを参照する外部キーを持つことはできません。
外部キーを存在しないカラムに追加しようとすると、そのカラムが自動的に作成されます。
NOT NULL 句 外部キーカラムを NULL 入力不可にします。外部キー内の NULL は、外部テーブルのこのローに該当するローがプライマリテーブル内にないことを意味します。
role-name 句 役割名は外部キーの名前です。役割名の主な機能は、同じテーブルに対する 2 つの外部キーを区別することです。役割名を指定しない場合、役割名は以下のように設定されます。
テーブル名と同じ役割名を含む外部キーが存在しない場合、テーブル名が役割名として割り当てられます。
テーブル名がすでに使用されている場合、役割名は、0 が埋め込まれた、テーブルに固有の 3 桁の数字と結合されたテーブル名になります。
REFERENCES 句 外部キー制約は、REFERENCES カラム制約または FOREIGN KEY テーブル制約を使用して実装できます。このとき、1 つ以上のカラムを指定できます。REFERENCES カラム制約に column-name を指定する場合、一意性制約またはプライマリキーの制約を受ける、プライマリテーブルのカラム名を指定します。また、この制約は、その 1 カラムだけで構成します。column-name を指定しない場合、外部キーはプライマリテーブルに含まれる単一のプライマリキーのカラムを参照します。
MATCH 句 MATCH 句は、孤立したローの内容と参照整合性違反の内容を管理できるようにすることによって、複数カラムの外部キーを使用した場合に何が一致と見なされるかを決定します。MATCH 句では、また、キーの一意性を指定することで、一意性を別に宣言する必要がなくなります。
次に、指定できる MATCH タイプを示します。MATCH タイプが一致動作にどのような影響を及ぼすかについては、このトピックの最後にある「例」の項を参照してください。
MATCH [ UNIQUE ] SIMPLE 外部キーテーブルのローに一致が発生するのは、すべてのカラム値がプライマリキーテーブルのローにある対応するカラム値と一致する場合です。外部キーテーブルでローが孤立するのは、外部キーの少なくとも 1 つのカラム値が NULL である場合です。
MATCH SIMPLE はデフォルトの動作です。
UNIQUE キーワードを指定すると、NULL 以外のキー値に対して、参照テーブルで一致が 1 つのみになります。
MATCH [ UNIQUE ] FULL 外部キーテーブルのローに一致が発生するのは、いずれの値も NULL ではなく、値がプライマリキーテーブルのローにある対応するカラム値と一致する場合です。ローが孤立するのは、外部キーのすべてのカラム値が NULL の場合です。
UNIQUE キーワードを指定すると、NULL 以外のキー値に対して、参照テーブルで一致が 1 つのみになります。
UNIQUE 句 column-constraint 句では、UNIQUE 制約はカラム値をユニークにする必要があることを示します。table-constraint 句では、UNIQUE 制約は、テーブル内の各ローをユニークに識別する 1 つ以上のカラムを指定します。テーブル内の異なるローが、指定されているすべてのカラムで同じ値を持つことはできません。1 つのテーブルは複数の UNIQUE 制約を持つことができます。
UNIQUE 制約はユニークインデックスとは異なります。ユニークインデックスのカラムは NULL でもかまいません。一方、UNIQUE 制約のカラムは NULL にはなりません。また、外部キーは、プライマリキーまたは UNIQUE 制約を参照できますが、ユニークインデックスは参照できません。ユニークインデックスは NULL の複数のインスタンスを含むことがあるからです。
UNIQUE 制約のカラムは、任意の順序で指定できます。また、各カラムに ASC (昇順) または DESC (降順) を指定することで、自動的に作成された対応するインデックスの値の順序を指定できます。ただし、カラム名を重複して指定することはできません。
一意性制約には、カラムに FLOAT や DOUBLE などの概数値データ型を使用しないことをおすすめします。概数値データ型は、算術演算後の丸め誤差がでます。
また、CLUSTERED キーワードを指定して、制約をクラスタ化するかどうかを指定することもできます。
CHECK 句 この制約で、任意の条件を検証できます。たとえば、CHECK 制約を使うと、Sex というカラムには M または F の値だけが確実に入ります。
テーブル内の 2 つ以上のカラム間の関係 (カラム A はカラム B 未満である必要があるなど) が関与する CHECK 制約の作成が必要な場合は、代わりにテーブル制約を定義します。
テーブルのどのローも 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、検査制約などの他のアクションの遅延は発生しません。
FOR OLAP WORKLOAD 句 外部キー定義の REFERENCES 句に FOR OLAP 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 句を使用して作成されたテーブルと同じです。
同じスコープ内にある 2 つのローカルテンポラリテーブルは、同じ名前にはできません。ベーステーブルと同じ名前のテンポラリテーブルを作成すると、ローカルテンポラリテーブルのスコープが終了した時点で、そのベーステーブルは、その接続内でのみ参照できるようになります。接続では、既存のテンポラリテーブルと同じ名前のベーステーブルを作成できません。
SQL Anywhere のカラムはデフォルトで NULL を許容しています。この設定は、allow_nulls_by_default データベースオプションを使用して制御できます。
ユーザ本人が所有するテーブルを作成するには、CREATE TABLE システム権限が必要です。他のユーザが所有するテーブルを作成するには、CREATE ANY TABLE または CREATE ANY OBJECT のシステム権限が必要です。
ユーザ本人が所有するプロキシテーブルを作成するには、CREATE PROXY TABLE システム権限が必要です。他のユーザが所有するプロキシテーブルを作成するには、CREATE ANY TABLE または CREATE ANY OBJECT のシステム権限が必要です。
オートコミット (グローバルテンポラリテーブルを作成しているときにも適用)。
SQL/2008 CREATE TABLE は SQL/2008 標準のコア機能ですが、SQL Anywhere でサポートされている一部のコンポーネントはオプションの SQL 言語機能です。これらの機能のサブセットを次に示します。
テンポラリテーブルのサポートは、SQL 言語機能 F531 です。
IDENTITY カラムのサポートは SQL 機能 T174 ですが、SQL Anywhere では標準とは少し異なる構文が使用されます。
外部キー制約のサポートには、SQL 言語機能 T191 "Referential action: RESTRICT"、F741 "Referential MATCH types"、F191 "Referential delete actions"、F701 "Referential update actions" が含まれています。SQL Anywhere では、MATCH PARTIAL はサポートされていません。
SQL Anywhere では、SQL 言語機能 T591 (UNIQUE constraints of possibly null columns) はサポートされていません。SQL Anywhere では、PRIMARY KEY 制約または UNIQUE 制約の一部であるすべてのカラムを NOT NULL と宣言してください。
CREATE TABLE の次のコンポーネントは、ベンダー拡張です。
{ IN | ON } dbspace-name 句
ENCRYPTED 句、NOT TRANSACTIONAL 句、SHARE BY ALL 句
カラム定義の COMPRESSED, INLINE 句、PREFIX 句、NO INDEX 句
AUTOINCREMENT、GLOBAL AUTOINCREMENT、CURRENT DATABASE、CURRENT REMOTE USER、CURRENT UTC TIMESTAMP、ほとんどの特別値などの、実装依存のさまざまな DEFAULT 値。また、SEQUENCE ジェネレータを参照する DEFAULT 句も、ベンダー拡張です。
MATCH UNIQUE の指定
PRIMARY KEY 句または FOREIGN KEY 句での指定値のソート方法 (ASC または DESC)
参照先テーブルの PRIMARY KEY 句での指定と異なる順序で FOREIGN KEY カラムを指定する機能
次の文は、file_name と file_contents という 2 つのカラムを持つテーブル file_table を作成します。contents カラムは LONG BINARY であり、圧縮されています。
CREATE TABLE file_table ( file_name VARCHAR(255), file_contents LONG BINARY COMPRESSED ); |
次の例は、図書データベース用にテーブルを作成し、図書情報を保持します。
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 ); |
次の例では、図書データベース用にテーブルを作成して、貸し出し図書の情報を保持します。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'; |
次の例は、2 つのテーブル Table1 と Table2 を作成し、外部キーを Table2 に追加し、値を Table1 に挿入します。最後の文は、値を Table2 に挿入しようとします。挿入しようとした値は Table1 と単純一致しないため、エラーが返されます。
CREATE TABLE Table1 ( P1 INT, P2 INT, P3 INT, P4 INT, P5 INT, P6 INT, PRIMARY KEY ( P1, P2 ) ); CREATE TABLE Table2 ( F1 INT, F2 INT, F3 INT, PRIMARY KEY ( F1, F2 ) ); ALTER TABLE Table2 ADD FOREIGN KEY fk2( F1,F2 ) REFERENCES Table1( P1, P2 ) MATCH SIMPLE; INSERT INTO Table1 (P1, P2, P3, P4, P5, P6) VALUES ( 1,2,3,4,5,6 ); INSERT INTO Table2 (F1,F2) VALUES ( 3,4 ); |
次の文は、キーの一部 (すべてではない) のカラムが NULL の場合に、MATCH SIMPLE と MATCH SIMPLE UNIQUE で、複数カラムの外部キーの処理方法がどのように異なるかを示します。2 番目のカラムの値がユニークではないため、この文は失敗します。
CREATE TABLE pt( pk INT PRIMARY KEY, str VARCHAR(10)); INSERT INTO pt VALUES(1,'one'), (2,'two'); COMMIT; CREATE TABLE ft1( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH SIMPLE); INSERT INTO ft1 VALUES(100,1), (200,1); //This statement will insert 2 rows. CREATE TABLE ft2( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH UNIQUE SIMPLE); INSERT INTO ft2 VALUES(100,1), (200,1); |
次の文は、MATCH SIMPLE と MATCH UNIQUE SIMPLE がどのように異なるかを示します。
CREATE TABLE pt2( pk1 INT NOT NULL, pk2 INT NOT NULL, str VARCHAR(10), PRIMARY KEY (pk1,pk2)); INSERT INTO pt2 VALUES(1,10,'one-ten'), (2,20,'two-twenty'); COMMIT; CREATE TABLE ft3( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); ALTER TABLE ft3 ADD FOREIGN KEY (ref1,ref2) REFERENCES pt2 (pk1,pk2) MATCH SIMPLE; CREATE TABLE ft4( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); INSERT INTO ft3 VALUES(100,1,10); // MATCH SIMPLE test succeeds; all column values match the corresponding values in pt2. INSERT INTO ft3 VALUES(200,null,null); // MATCH SIMPLE test succeeds; at least one column in the key is null. INSERT INTO ft3 VALUES(300,2,null); // MATCH SIMPLE test succeeds; at least one column in the key is null. INSERT INTO ft4 VALUES(100,1,10); // MATCH FULL test succeeds; all column values match the corresponding values in pt2. INSERT INTO ft4 VALUES(200,null,null); // MATCH FULL test succeeds; all column values in the key are null. INSERT INTO ft4 VALUES(300,2,null); // MATCH FULL test fails; both columns in the key must be null or match the corresponding values in pt2. |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |