既存のデータベース・オブジェクトの代替名またはシノニムを作成します。オブジェクトとは、ドメイン、ファンクション、モジュール、プロシージャ、シーケンス、別のシノニム、表、ビューのいずれかです。シノニムの定義後は、問合せやデータ定義言語文で、被参照オブジェクトのかわりに使用できます。
ただし、SHOWコマンドではシノニムを受け入れません。名前がシノニムかどうかを判別するには、SHOW SYNONYM文を使用します。
CREATE SYNONYM文は次の環境で使用できます。
- 対話型SQL内
- ホスト言語プログラムに埋め込まれる場合
- SQLモジュールまたはその他の複合文のプロシージャの一部として
- 動的SQLで動的に実行される文として
COMMENT IS 'quoted-string'
このオプションの句は、複数行のコメントをシノニム・オブジェクトに追加する場合に使用できます。コメントはSHOW SYNONYM文によって表示されます。FOR object-name
シノニムを必要とするデータベース・オブジェクトの名前です。この名前は、データベース内のオブジェクト用として存在している必要があります。オプションのオブジェクト・タイプが省略されると、Oracle Rdbではこの名前のオブジェクトについてデータベースを検索します。DOMAIN
FUNCTION
MODULE
PROCEDURE
SEQUENCE
SYNONYM
TABLE
これらのオプションのオブジェクト・タイプは、被参照オブジェクト名がデータベース内で一意でない場合に使用できます。たとえば、Oracle Rdbではドメインと表は両者ともMONEYと呼ばれます。したがって、表MONEYのシノニムを作成するには、一意に識別できるようにFOR TABLE句を使用する必要があります。OR REPLACE
この名前のシノニムがある場合は置換するようにSQLに指示します。存在しない場合は、新しいシノニムを作成します。この簡略化により、問合せおよびこのシノニムのDDL使用によって確立されたすべての依存性を維持しながら、既存のシノニムの置換が可能になります。PUBLIC
このオプションの句は、Oracleデータベース・サーバーとの互換性を目的としています。Oracle Rdbでは現在使用されていません。使用するかどうかは、将来のリリースで決定します。アプリケーションではPUBLICキーワードの使用をお薦めします。synonym-name
作成するシノニムの名前です。シノニム名は、データベース内のすべてのドメイン、表、ビュー、ファンクション、プロシージャ、モジュール、シーケンス、シノニムで一意である必要があります。これは別名で修飾することもできます。
- CREATE SYNONYM文を実行するには、データベースのCREATE権限が必要です。
- 被参照オブジェクトのシノニムを作成するには、そのオブジェクトに対するREFERENCES権限が必要です。ドメインにはアクセス制御がないため、ドメインのシノニムを作成する場合にその他の権限は必要ありません。
- データベースでシノニムが有効になっている必要があります。ALTER DATABASE...SYNONYMS ARE ENABLED句によって新しいシステム関係RDB$OBJECT_SYNONYMSが作成され、この関係を使用してこの文で作成されたシノニムを記録します。
- シノニムにはアクセス制御はありません。かわりに、シノニムへの権限付与、またはシノニムからの権限の取消しがベース・オブジェクトの参照と同じことになります。次の例では、GRANT文でPUBLICに対してEMPLOYEES表のSELECT権限を付与しています。
SQL> CREATE SYNONYM EMPS FOR EMPLOYEES; SQL> GRANT SELECT ON TABLE EMPS TO PUBLIC;
- シノニムに対するシノニムを作成することもできます。これによりシノニムのチェーンが形成されます。このチェーンを処理してベース・データベース・オブジェクトを決定する必要があります。このチェーンの参照は、10未満にしておくことをお薦めします。Oracle Rdbでは最大長64のチェーンを実行できます。
例1: デフォルトの別名の使用
SQL> CREATE SYNONYM emps FOR employees;
例2: シノニムの明示的な別名の使用
SQL> CREATE SYNONYM db1.emps FOR employees;
例3: 被参照オブジェクトの明示的な別名の使用
SQL> CREATE SYNONYM emps FOR db1.employees;
例4: 明示的な別名の使用
SQL> CREATE SYNONYM db1.emps FOR db1.employees;
例5: 表タイプの使用
SQL> CREATE SYNONYM cash FOR table money cont> COMMENT IS 'use a different name to avoid confusion with' cont> / 'the domain MONEY';
例6: 複数シノニムの使用
SQL> CREATE TABLE t_employees_0001 (...); SQL> CREATE SYNONYM employees FOR t_employees_0001; SQL> CREATE SYNONYM emps FOR employees;
一時または永続実表の定義を作成します。表定義は、表の行となる列定義のリストで構成されます。永続実表とは、メタデータおよびデータが1つのSQLセッションの範囲を超えてデータベースに格納される表のことです。データはデータベースにアタッチしたすべてのユーザーが共有できます。
一時表とは、SQLセッションまたはモジュールが終了するとデータが自動的に削除される表のことです。この表は、SQLセッションで参照し、SQLセッションに対してデータがローカルな場合のみ具体化します。セッション内で、トランザクションの終わりにデータを保存するか、削除するかを指定することもできます。デフォルトの設定はデータ削除です。一時表のデータはユーザーには非公開です。一時表には次の3種類があります。
- グローバル一時表
- ローカル一時表
- 宣言されたローカル一時表(詳細は、「DECLARE LOCAL TEMPORARY TABLE文」を参照)
グローバル一時表のメタデータはデータベースに格納され、そのSQLセッションの範囲を超えて永続します。様々なSQLセッションで同じメタデータを共有できます。表に格納されているデータは、SQLセッション間では共有できません。ただし、データは、単一のSQLセッションのモジュール間で共有できます。データは1つのSQLセッションの範囲を超えて永続しません。
ローカル一時表のメタデータはデータベースに格納され、SQLセッションの範囲を超えて永続します。様々なSQLセッションで同じメタデータを共有できます。表に格納されているデータは、単一のSQLセッションの様々なモジュール間やSQLセッション間では共有できません。データは1つのSQLセッションやモジュールの範囲を超えて永続しません。
一時表は、ユーザーのデータ保持用として使用され、そのデータは他のユーザーとは共有されないためロックは不要であり、読取り専用トランザクションで変更できます。
一時表の詳細は、『Oracle Rdb7 Guide to Database Design and Definition』を参照してください。
情報表は読取り専用の特殊な表であり、既存のリレーショナル表に格納されていないデータベース属性の取得に使用できます。情報表により、現在、内部形式で格納されている目的のデータベース情報をリレーショナル表として表示できます。
表を定義するとき、表の制約も定義できます。制約は、表に格納できる値を制限する条件を指定します。制約によって列に格納するものを次のように指定できます。
- 特定の値のみ
- 主キー値
- 一意の値
- NULLにできない値
CREATE TABLE文で表定義を指定するには、次のように複数の方法があります。
- 表、その列および関連データ型、デフォルト値(オプション)、制約定義(オプション)、フォーマット句の直接指定
永続実表およびグローバル一時表でのみ制約を定義できます。- 表名、列およびデータ型を指定するリポジトリ・レコード定義のパス名の間接的な指定
- 列、データ型およびNOT NULL制約の継承時モデルとしての別の表の間接的な指定
CREATE TABLE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
ALIAS alias
特定のデータベースにアタッチする名前を指定します。SQLでは、この別名で参照されるデータベースに表定義を追加します。別名を指定しない場合、SQLではデフォルト・データベースに表定義を追加します。デフォルト・データベースおよび別名の詳細は、第2.2.1項を参照してください。
AUTOMATIC AS value-expr
AUTOMATIC INSERT AS value-expr
AUTOMATIC UPDATE AS value-expr
これらのAUTOMATIC列句を使用すると、データが行に挿入された場合、または行が更新された場合に特別な情報を格納できます。たとえば、アプリケーション固有の情報を記録して、アクティビティを監査したり、タイムスタンプまたはデータの一意の識別子などの重要な値を提供できます。これらのタイプの列に対する値の割当ては、Oracle Rdbにより管理されます。AUTOMATIC INSERT句を使用して、行が挿入される場合に、列に対して複合デフォルトを提供できます。これは、UPDATE文では変更できません。AUTOMATIC UPDATE句は、UPDATE文に更新値を提供する場合に使用できます。修飾されていないAUTOMATIC句は、INSERT文とUPDATE文の両方に値式が適用されるよう指定します。列タイプはAS value-exprから適用されます。CASTを使用すると、特定のデータ型を指定できます。ただし、これは必須ではなく、必要な場合も限られます。
AUTOMATIC INSERT列を定義して、挿入操作時に自動的にデータを受信できます。データは他の列と同様に格納されますが、列は読取り専用です。AUTOMATIC列は読取り専用列として処理されるため、挿入操作用の列リストには表示されず、更新操作によっても変更されません。AUTOMATIC UPDATE列には、行が挿入されるときに使用される関連付けられたデフォルト値を格納できます。「例」の項の「例15」を参照してください。
char-data-type
有効なSQL文字データ型です。文字データ型の詳細は、第2.3.1項を参照してください。character-set-name
有効なキャラクタ・セット名です。CHECK predicate
表に挿入された列値が満たす必要がある条件を指定します。条件指定の詳細は、第2.7節を参照してください。CHECK列制約の条件では、関連付けられた列のみ直接参照されます。詳細は、「使用方法」を参照してください。
col-constraint
関連する列に格納されている値に適用される制約です。SQLでは、列の制約と表の制約が可能です。「使用方法」では、列の制約と表の制約の相違をまとめています。列制約には、PRIMARY KEY、UNIQUE、NOT NULL、CHECKおよびFOREIGN KEY制約の5つのタイプがあります。FOREIGN KEY制約はREFERENCES句で作成されます。
列制約は、永続実表およびグローバル一時表に対してのみ定義できます。
col-definition
表の列に対する定義です。SQLでは、列定義の指定には次の2通りの方法があります。
- 列名と関連付けるためのデータ型の直接指定
- 列名と関連付けるためのデータ型を間接的に指定するドメイン名の指定
どちらの方法でも、デフォルト値、列制約およびフォーマット句を指定できます。
column-name
表内に作成する列の名前です。列の定義に直接データ型を指定するか、または列の定義にドメイン名を指定して間接的にデータ型を指定するかに関係なく、列名を指定する必要があります。COMPUTED BY value-expr
この列の値が、他の列および定数式から算出されるよう指定します。列定義が値式内の列名を参照する場合、指定した列は同じCREATE TABLE文内で定義されている必要があります。値式の詳細は、第2.6節を参照してください。
算出列の定義を参照する列は、最初にその算出列を削除する場合を除き、その表から削除できません。
SQLでは、次のものが算出列には認められません。
- UNIQUE制約
- REFERENCES句
- PRIMARY KEY制約
- DEFAULT句
- IDENTITY句
- DATATRIEVEのデフォルト値
たとえば、従業員のFICA_RATEが従業員の初任給の6.10%で、団体保険が0.7%である場合、次のようにFICA_RATEおよびGROUP_RATE列を定義できます。
SQL> CREATE TABLE payroll_detail cont> (salary_code CHAR(1), cont> starting_salary SMALLINT(2), cont> fica_amt cont> COMPUTED BY (starting_salary * 0.061), cont> group_rate cont> COMPUTED BY (starting_salary * 0.007));
このタイプの定義を使用する場合は、salary_codeとstarting_salaryの列の値のみを格納します。FICAおよび団体保険控除の列は、列fica_amtまたはgroup_rateを選択すると自動的に計算されます。
例11に、選択式を使用するCOMPUTED BY列を示します。
constraint-attributes
制約属性構文により、表6-3に示すように、SQL99規格の要件に応じて11の順列が指定されますが、これらは次の3つのオプションと同じです。
- INITIALLY IMMEDIATE NOT DEFERRABLE
INSERT文、DELETE文またはUPDATE文の実行時に制約が評価されるように指定します。SQL99、SQL92、MIA、ORACLE LEVEL1またはORACLE LEVEL2言語を使用している場合、これがデフォルトです。- INITIALLY IMMEDIATE DEFERRABLE
制約の評価が遅延する場合がある(EVALUATING句を指定してSET CONSTRAINT ALL文またはSET TRANSACTION文を使用)が、デフォルトでINSERT文、DELETE文またはUPDATE文の実行後に評価されることを指定します。詳細は、「SET ALL CONSTRAINTS文」を参照してください。- INITIALLY DEFERRED DEFERRABLE
後からいつでも制約を評価できるよう指定します。指定されない場合、制約の評価はCOMMIT文の実行時に行われます。SET ALL CONSTRAINTS文を使用すると、すべての制約を先に評価できます。詳細は、SET ALL CONSTRAINTS文の説明を参照してください。
デフォルトのSQLV40言語を使用している場合は、これがデフォルトの制約属性になります。この言語を使用する場合、いずれかの制約属性を指定せずに定義されたすべての制約に対し、Oracle Rdbによって廃止予定の機能としてメッセージが表示されます。
CONSTRAINT constraint-name
列または表の制約の名前を指定します。この名前は、次のような様々な目的に使用されます。
- INSERT文、UPDATE文またはDELETE文が制約に違反した場合は、RDB$INTEG_FAILエラー・メッセージによりその名前が指定されます。
- ALTER TABLE table-name DROP CONSTRAINT constraint-name文により、表の制約を削除する名前を指定します。
- SHOW TABLE文により、列制約および表制約の名前が表示されます。
- SET TRANSACTION文およびDECLARE TRANSACTION文のEVALUATING句により、制約名が指定されます。
- ALTER TABLE文およびCREATE TABLE文のENABLEおよびDISABLE句により、制約名が指定されます。
- ALTER CONSTRAINT文により制約名が指定されます。
- DROP CONSTRAINT文
CONSTRAINT句はオプションです。制約名を省略すると、SQLにより名前が作成されます。ただし、Oracle Rdbでは、列制約および表制約に常に名前を付けることをお薦めします。CONSTRAINT句を使用して制約名を指定する場合、マルチスキーマ・データベースを使用しているときは、その名前はデータベース内またはスキーマ内で一意である必要があります。
data-type
有効なSQLデータ型です。列に関連付ける明示的なデータ型の指定は、ドメイン名指定の代替手段です。データ型の詳細は、第2.3節を参照してください。date-time-data-types
日付、時間、または期間を指定するデータ型です。日時データ型の詳細は、第2.3.2項を参照してください。DEFAULT value-expr
挿入された列にその列の値が含まれていない場合に、列のデフォルト値を設定します。副問合せ、条件、文字、日/時および数式を含む、あらゆる値式をデフォルト値として使用できます。値式の詳細は、第2.6節を参照してください。
NULLの詳細は、第2.6.1項およびこの引数リストに続く「使用方法」を参照してください。
第2.6節で説明している値式には、DBKEYおよび集計関数が含まれています。ただしDEFAULT句は、DBKEYまたは集計関数の参照に有効な場所ではありません。いずれかを参照しようとすると、コンパイル時エラーが表示されます。
デフォルト値を指定しない場合、列はドメインからのデフォルト値を継承します。列またはドメインのいずれにもデフォルト値を指定しない場合、SQLはNULLをデフォルト値として割り当てます。
domain-name
CREATE DOMAIN文で作成されるドメインの名前です。SQLにより、列にはドメインで指定したデータ型が指定されます。ドメインの詳細は、「CREATE DOMAIN文」を参照してください。通常の目的には、明示的なデータ型ではなくドメインを指定します。
- ドメインにより、同じ目的で使用される複数の表の列がすべて同じデータ型を持つようになります。たとえば、サンプルの人事データベース内の複数の表はドメインID_DOMを参照します。
- ALTER DOMAIN文を使用してドメイン自体を変更することにより、すべての列が参照しているデータ型を1回の操作で変更できます。
たとえば、EMPLOYEE_ID列のデータ型をCHAR(5)からCHAR(6)に変更する場合は、ドメインID_DOMのデータ型のみを変更します。DEGREES表、EMPLOYEES表、JOB_HISTORY表、およびSALARY_HISTORY表に含まれるEMPLOYEE_ID列のデータ型や、表DEPARTMENTSに含まれるMANAGER_ID列を変更する必要はありません。
ただし、次の場合は、表の作成時にドメインを使用しないことをお薦めします。
- 使用するアプリケーションがOracle RDBMSと互換性を持つ必要がある場合。
- ドメインによる利点を必要としない中間結果表を作成している場合。
enable-disable-clause
次のリストで説明する、全制約、指定した制約、主キー、または一意の列名を有効または無効にできます。デフォルトでは、表作成の操作時に追加された表制約および列制約は有効になっています。
- DISABLE ALL CONSTRAINTS
この表に対する表制約および列制約がすべて無効になります。この表で制約が定義されていない場合でも、エラーは発生しません。- ENABLEE ALL CONSTRAINTS
この表に対する表制約および列制約がすべて有効になります。この表で制約が定義されていない場合でも、エラーは発生しません。- DISABLE CONSTRAINT constraint-name
指定された制約が無効になります。指定された制約は、表に対する表制約および列制約である必要があります。- ENABLE CONSTRAINT constraint-name
指定された制約が有効になります。指定された制約は、表に対する表制約および列制約である必要があります。- DISABLE PRIMARY KEY
表の主キーが無効になります。- ENABLE PRIMARY KEY
表の主キーが有効になります。- DISABLE UNIQUE (column-name)
一致するUNIQUE制約が無効になります。リストされた列は表の列である必要があります。- ENABLE UNIQUE (column-name)
一致するUNIQUE制約が有効になります。リストされた列は表の列である必要があります。
FOREIGN KEY column-name
定義する表(参照表)の外部キーとして宣言する列の名前です。算出列は外部キーとして宣言できません。FROM path-name
リポジトリ・レコード定義のリポジトリ・パス名を指定します。SQLでは、このレコードから定義を使用して表を作成し、表にレコード定義の名前を付けます。FROM path-name句を使用して表を作成できるのは、リポジトリのレコード定義が、最初に作成したリポジトリの共通ディクショナリ演算子(CDO)ユーティリティを使用して作成されている場合のみです。たとえば、レコード定義がSQLセッションの一部としてリポジトリに作成されている場合は、FROM path-name句では表を作成できません。
リポジトリのレコードにネストされた定義が含まれている場合は、それに基づいて表を作成することはできません。
リポジトリのレコード定義に基づいて表を作成するのは、多くのアプリケーションで同一の定義を共有する場合に便利です。一般定義への変更は、それを使用するすべてのアプリケーションに自動的に反映されます。
注意
他のユーザーまたはアプリケーションによるリポジトリ内のレコード定義の変更は、リポジトリがINTEGRATE DATABASE...ALTER FILES文に一致するようにデータベースを統合すると、表定義に影響します。このような変更に表や表の列の基礎となるレコードやフィールドの削除が含まれている場合、それに依存する表や表の列にあるデータは、次にINTEGRATE DATABASE...ALTER FILES文が実行されると失われます。
FROM句は、PATHNAMEを指定してデータベースがアタッチされている場合のみ使用できます。リポジトリ・パス名としてフルパス名または相対パス名のいずれかを指定できます。
CREATE TABLE文のFROM path-name形式を使用する場合は、DATATRIEVEフォーマット句など、制約や他の表定義句は定義できません。この制限によって、後でALTER TABLE文を使用してそれを追加できないということはありません。
CREATE DATABASE文にCREATE TABLE文を埋め込む場合は、FROM path-name句は使用できません。
GLOBAL TEMPORARY
LOCAL
表定義がグローバル一時表、またはローカル一時表のどちらであるかを指定します。IDENTITY
列が特殊な読取り専用識別列であることを指定します。INSERTによってこの列が評価され、挿入された各行の一意の値が格納されます。表の1列のみがIDENTITY属性を保持できます。Rdbにより、現在の表と同じ名前を持つ順序が作成されます。詳細は、「ALTER SEQUENCE文」および「CREATE SEQUENCE文」を参照してください。
increment-by
IDENTITY列に作成された順序の増分を指定する整数リテラル値です。負の値によって降順が、正の値によって昇順が作成されます。値ゼロは使用できません。デフォルト値の1が省略される場合、昇順になります。INFORMATION
表定義が情報表であることを指定します。情報表の詳細は、付録Iを参照してください。情報表はオラクル社で使用するために予約されています。
LIKE other-table-name
データベース管理者は、既存表用にメタデータをコピーし、類似する特性で新規の表を作成できます。オプションの列リストを使用すると、この表に列および制約を追加できます。被参照表は作成する表と同じデータベース内にある必要があります。LOGGING
NOLOGGING
LOGGING句は、CREATE TABLE文がリカバリ・ユニット・ジャーナル・ファイル(.ruj)とアフター・イメージ・ジャーナル・ファイル(.aij)に記録されることを指定します。NOLOGGING句は、CREATE TABLE文がリカバリ・ユニット・ジャーナル・ファイル(.ruj)とアフター・イメージ・ジャーナル・ファイル(.aij)に記録されないことを指定します。
デフォルトはLOGGING句です。
NOT NULL
列の値をNULL以外の値に制限します。ON COMMIT PRESERVE ROWS
ON COMMIT DELETE ROWS
グローバル一時表またはローカル一時表のみで、COMMIT文の後にデータを保持するか、削除するかを指定します。指定しない場合、デフォルトはON COMMIT DELETE ROWSです。
PRIMARY KEY
主キー制約により、その値によって表内の行を他の行とは区別する1つ以上の列が定義されます。SQLでは主キー列の値が一意でありNULLではないことを必要とします。したがって、主キー列に対してUNIQUE列制約およびNOT NULL列制約を指定する必要はありません。算出列には主キー制約を指定できません。
表制約として使用する場合は、列名のリストをこの句の後に付ける必要があります。列制約として使用する場合は、この句を表の指定された列に適用します。
references-clause
一意キーまたは主キーの列名、または被参照表の列名を指定します。表制約としてREFERENCES句が使用される場合は、FOREIGN KEY句で指定される列名が参照表の外部キーになります。列タイプ句として使用する場合は、列のタイプは参照されるPRIMARY KEY索引またはUNIQUE索引から継承されるよう指定します。データ型とドメインの両方が継承されます。
REFERENCES referenced-table-name
参照表によって参照される一意キーまたは主キーを含む表の名前を指定します。別の表にある一意キーまたは主キーを参照する制約を宣言するには、被参照表に対するSQL REFERENCESまたはCREATE権限が必要です。referenced-column-name
列制約の場合、被参照表の一意キーまたは主キーである列の名前です。算出列は被参照列名としては使用できません。表制約では、被参照列名が被参照表の一意キーまたは主キーである列の名前です。referenced-column-name句を省略すると、デフォルトで主キーが選択されます。列数とそのデータ型は一致する必要があります。sql-and-dtr-clause
オプションのSQLフォーマット句です。フォーマット句の詳細は、第2.5節を参照してください。