シノニム定義を変更します。
ALTER SYNONYM文は次の環境で使用できます。
- 対話型SQL内
- ホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
COMMENT IS string
この句は、複数行のコメントをシノニム・オブジェクトに追加する場合に使用できます。SHOW SYNONYM文によって、コメントが表示されます。この句は、COMMENT ON SYNONYM文と同義です。
FOR object-name
シノニムを、別のデータベース・オブジェクトを参照するように変更する場合がありますが、型が同じである必要があります。Oracle Rdbでは、オブジェクトが被参照オブジェクトと同じまたは同様の特性を持つことを想定しています。被参照オブジェクトは、データベースに存在している必要があります。synonym-name
変更する既存のシノニムの名前です。
- シノニムに対して有効になっていないデータベースにこの文を使用する場合、エラーが発生します。「ALTER DATABASE... SYNONYMS ARE ENABLED句」を参照してください。
- ALTER SYNONYM文を実行するには、データベースALTER権限が必要です。
- 被参照オブジェクトのシノニムを変更するには、そのオブジェクトに対するREFERENCES権限が必要です。ドメインにはアクセス制御がないため、ドメインのシノニムを変更する場合にその他の権限は必要ありません。
- シノニムに対するシノニムを変更できます。したがって、シノニムの連鎖内でサイクルを作成できます。Oracle Rdbでは、このサイクルが検出されて定義が拒否されます。
例1: コメントの追加
SQL> ALTER SYNONYM CASH cont> COMMENT IS 'use a different name to avoid confusion with' cont> / 'the domain MONEY';
例2: 複数シノニムの使用およびALTERによる被参照表の変更
次の例では、表の参照にシノニムが使用されます。後で空の表を作成して、この新規の表を参照するようにシノニムを変更できます。ビュー定義を使用する場合と類似していますが、シノニムを使用する場合はビューの使用ロックが回避されます。新規のビューを削除したり作成するには、他のユーザーがそのビューを参照していないことが必要ですが、変更シノニムでは表への排他アクセスが不要です。
SQL> CREATE TABLE t_employees_0001 (...); SQL> CREATE SYNONYM employees FOR t_employees_0001; SQL> CREATE SYNONYM emps FOR employees; SQL> CREATE TABLE t_employees_0002 LIKE t_employees_0001; SQL> ALTER SYNONYM employees FOR t_employees_0002;
既存の表定義が変更されます。次を実行できます。
- 列の追加
- 表または列に対する制約の追加
- 列の変更
- キャラクタ・セットの変更
- データ型の変更
- 列の削除
- 制約の削除
ALTER TABLE文でも、表固有の制約を追加または削除できます。SHOW TABLE文を使用すると、表に現在関連付けられている制約の名前をすべて表示できます。制約は表レベルおよび列レベルの両方で、いくつでも削除および宣言できます。「ALTER CONSTRAINT文」および「DROP CONSTRAINT文」も参照してください。
この文を実行する場合、SQLにより表内の名前の付いた列定義が変更されます。指定しないすべての列は変更されないままです。制約を定義する前に、新しい列がSQLにより定義されます。次に、制約は、格納される前にSQLにより定義および評価されます。したがって、列および制約が同じ表定義内で定義される場合、制約は常に最新バージョンの列に適用されます。
表定義を変更すると、変更された定義を他のユーザーが参照できるのは、変更がコミットされた後にデータベースに接続した場合のみになります。
ALTER TABLE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
ADD (...)
この代替構文は、Oracle RDBMSとの互換性を目的として追加されます。ADD COLUMN col-definition
表に追加の列を作成します。position-clauseによって新規の列が再配置されるまで、SQLにより、表の既存のすべての列の後に列が追加されます。列定義により、データ型またはドメイン名、オプションのデフォルト値、オプションの列制約、およびオプションのフォーマット句が指定されます。COLUMNキーワードはオプションです。
ADD CONSTRAINT table-constraint
表制約の定義を追加します。表制約には、PRIMARY KEY、UNIQUE、CHECKおよびFOREIGN KEYの4つのタイプがあります。AFTER COLUMN column-name
BEFORE COLUMN column-name
列の通常のフィールド順序を読みやすい表示列順に変更します。その場合でも、ディスク上の列のレイアウトは変更されません。デフォルトでは、どちらの句も指定されない場合、列はALTER TABLE文で指定された表の最後に配置されます。ALTER COLUMN alter-col-definition
列名で指定された列を変更します。COLUMNキーワードはオプションです。列定義の要素には、変更できる部分とできない部分があります。
既存の列制約は変更できません。ただし、alter-col-definition句を使用して既存の制約を削除し、新規の列制約を追加することにより、列制約の変更と同じ結果を得ることができます。
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列には、行が挿入されるときに使用される関連付けられたデフォルト値を格納できます。
トランザクションの現在のタイムスタンプを格納し、順序番号に対して一意の数値を提供すると仮定します。さらに、行が更新(順序が変更)される場合は、LAST_UPDATED列に新規のタイムスタンプを書き込みます。この情報を提供するようにアプリケーションを記述できますが、目的の動作は保証されない可能性があります。たとえば、表にアクセスするユーザーが、対話型SQLによって表を更新しても、LAST_UPDATED列に新規のタイムスタンプの入力を忘れることも考えられます。このような場合、AUTOMATIC列をかわりに使用すると、挿入操作時に列にデータが自動的に入力されるよう定義できます。データは他の列と同様に格納されますが、列は読取り専用です。
AUTOMATIC列の詳細は、「使用方法」を参照してください。
char-data-types
有効なSQL文字データ型です。文字データ型の詳細は、第2.3.1項を参照してください。CHECK (predicate)
表に挿入された列値が満たす必要がある条件を指定します。条件指定の詳細は、第2.7節を参照してください。CHECK列制約の条件では、関連付けられた列のみ直接参照されます。詳細は、「CREATE TABLE文」の「使用方法」を参照してください。
col-constraint
表に挿入された列値が満たす必要がある条件を指定します。複数の列制約を指定できます。次に例を示します。
SQL> ALTER TABLE EMPLOYEE cont> ADD ID_NUMBER INT NOT NULL UNIQUE;
各制約に名前を付けることができます。次に例を示します。
SQL> ALTER TABLE EMPLOYEE cont> ADD ID_NUMBER INT cont> CONSTRAINT A NOT NULL cont> CONSTRAINT B UNIQUE;
column-name
追加または変更されている列の名前です。COMPUTED BY value-expr
この列の値が、他の列および定数式から算出されるよう指定します。詳細は、「CREATE TABLE文」を参照してください。constraint-attributes
制約属性構文により、表6-3に示すように、SQL99規格の要求に応じて11の順列が指定されますが、これらは次の3つのオプションと同じです。
- INITIALLY IMMEDIATE NOT DEFERRABLE
INSERT文、DELETE文またはUPDATE文の実行時に制約の評価を行う必要があることを指定します。SQL92、SQL99、MIA、ORACLE LEVEL1またはORACLE LEVEL2言語を使用している場合、これがデフォルトです。
この句は、Oracle Rdbの以前のリリースで提供されたNOT DEFERRABLEオプションと同じです。- INITIALLY DEFERRED DEFERRABLE
後からいつでも制約を評価できるよう指定します。指定されない場合、制約の評価はCOMMIT文の実行時に行われます。SET ALL CONSTRAINTS文を使用すると、すべての制約を先に評価できます。詳細は、「SET ALL CONSTRAINTS文」を参照してください。デフォルトのSQLV40言語を使用している場合は、これがデフォルトの制約属性になります。このデフォルトの言語を使用する場合、いずれかの制約属性の仕様を持たずに定義されたすべての制約に対し、Oracle Rdbによって廃止予定の機能としてメッセージが表示されます。
この句は、Oracle Rdbの以前のリリースで提供されたDEFERRABLEオプションと同じです。- INITIALLY IMMEDIATE DEFERRABLE
制約の評価が遅延する(SET CONSTRAINT ALL文またはSET TRANSACTION文をEVALUATING句とともに使用)が、デフォルトではINSERT文、DELETE文またはUPDATE文の実行後に評価されるよう指定します。
表6-3 制約属性構文順列および同等値 この句を指定する場合: この句のデフォルト: 句の指定なし INITIALLY IMMEDIATE NOT DEFERRABLE NOT DEFERRABLE INITIALLY IMMEDIATE INITIALLY IMMEDIATE NOT DEFERRABLE NOT DEFERRABLE INITIALLY IMMEDIATE INITIALLY DEFERRED INITIALLY DEFERRED DEFERRABLE DEFERRABLE INITIALLY DEFERRED INITIALLY DEFERRED DEFERRABLE DEFERRABLE INITIALLY IMMEDIATE DEFERRABLE INITIALLY IMMEDIATE DEFERRABLE DEFERRABLE INITIALLY IMMEDIATE
CONSTRAINT constraint-name
CONSTRAINT句によって、表制約の名前が指定されます。この名前は、次のような様々な目的に使用されます。
- INSERT文、UPDATE文またはDELETE文が制約に違反した場合は、INTEG_FAILエラー・メッセージによりその名前が指定されます。
- ALTER CONSTRAINT文、DROP CONSTRAINT文およびALTER TABLE DROP CONSTRAINT文により、制約名が指定されます。
- SHOW TABLE文により、制約名が表示されます。
- SET文およびDECLARE TRANSACTION文のEVALUATING句により、制約名が指定されます。
CONSTRAINT句はオプションです。制約名を省略すると、SQLにより名前が作成されます。ただし、Oracle Rdbでは、列制約および表制約に常に名前を付けることをお薦めします。SQLによって作成された制約名はあいまいな可能性があります。CONSTRAINT句を使用して制約名を指定する場合、その名前はスキーマで一意である必要があります。
data-type
有効なSQLデータ型です。列に関連付ける明示的なデータ型の指定は、ドメイン名指定の代替手段です。データ型の詳細は、第2.3節を参照してください。
列のデータ型を(ドメインの指定により直接的または間接的に)変更するためにALTER句を使用する場合は、次のような注意が必要です。
- 列をより容量の大きい文字データ型に変更するか、列のスケール変更係数を増やすか、キャラクタ・セットを変更すると、列を参照するソース・プログラムを変更して、プリコンパイルする必要が生じる場合があります。
- 列をより容量の小さい数値データ型に変更すると、Oracle Rdbによってより大きい値の新規のデータ型への変換が試行されるため、実行時にオーバーフロー・エラーが発生する可能性があります。
- 列をより容量の小さいデータ型に変更すると、SQLにより、データベースに格納されている値で新しいデータ型の容量を超えるものが取得される場合にかぎり、これらの値が切り捨てられます。(ただし、この値は更新されるまでデータベース内で切り捨てられません。データの取得のみを行う場合は、データ型を変更してオリジナルに戻すことができます。その後、SQLによりオリジナルの値全体が再度取得されます。)
- DATE列は、文字データ型(CHAR、VARCHAR、LONG VARCHAR、NCHAR、NATIONAL CHAR、NCHAR VARYINGまたはNATIONAL CHAR VARYING)、または日/時(DATE ANSI、TIMESTAMP、TIME)にのみ変更できます。DATE列をこれ以外のものに変更しようとすると、SQLによりエラー・メッセージが返されます。
date-time-data-types
有効なSQL日時データ型です。日時データ型の詳細は、第2.3.2項を参照してください。DEFAULT value-expr
挿入された列にその列の値が含まれていない場合に、列のデフォルト値を設定します。副問合せ、条件、文字、日/時および数式を含む、あらゆる値式をデフォルト値として使用できます。値式の詳細は、第2.6節を参照してください。
NULLの詳細は、第2.6.1項およびこの引数リストに続く「使用方法」を参照してください。
表を変更することにより、デフォルト値を既存の列に追加するか、列の既存のデフォルト値を変更できます。ただし、これを実行しても、既存の行に格納された値には影響を与えません。
第2.6節で説明している値式には、DBKEYおよび集計関数が含まれています。ただしDEFAULT句は、DBKEYまたは集計関数の参照に有効な場所ではありません。いずれかを参照しようとすると、コンパイル時エラーが表示されます。
デフォルト値を指定しない場合、列はドメインからのデフォルト値を継承します。列またはドメインのいずれにもデフォルト値を指定しない場合、SQLはNULLをデフォルト値として割り当てます。
列を追加するときに列またはドメインにデフォルト値を指定すると、SQLにより列またはドメインからのデフォルト値がすでに格納されているすべての行に伝播されます。したがって、列を表に追加し、その列にデフォルト値を指定する場合は、すでに格納されているすべての行の新しく追加された列に、SQLによりデフォルト値が格納されます。同様に、新しく追加された列がデフォルト値を指定するドメインに基づいている場合は、すでに格納されているすべての行の列に、SQLによりデフォルト値が格納されます。
次の例では、デフォルト値を指定する列を追加する場合に、SQLによりデフォルト値が列に格納されることを示します。
SQL> -- Add the column PHONE and specify a default value. SQL> -- SQL> ALTER TABLE EMPLOYEES cont> ADD PHONE CHAR(7) DEFAULT 'None'; SQL> -- SQL> -- The result table shows that the rows contain the default value SQL> -- of the PHONE column. SQL> -- SQL> SELECT LAST_NAME, PHONE FROM EMPLOYEES; LAST_NAME PHONE Toliver None Smith None Dietrich None Kilpatrick None . . . SQL>
NULL以外のデフォルト値を持つ列を追加すると、SQLによりデータが更新されるため、表に多くの行が含まれる場合、ALTER TABLE文では完了まで時間がかかる場合があります。(デフォルト値にNULLを指定すると、実際の値が格納されていない列に対して自動的にNULL値が返されるため、SQLによりデータが変更されません。)デフォルト値を持つ複数の列を追加する場合は、単一のALTER TABLE文に追加します。これを実行すると、SQLにより、複数回ではなく1回のみ表データがスキャンされます。
行にデータが追加されるため、デフォルト値を持つ列を追加すると、レコードが断片化される場合があります。レコードの断片化の位置および修正の詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。
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言語と互換性を持つ必要がある場合。
- ドメインによる利点を必要としない表を作成している場合。
DROP COLUMN column-name
指定した列を削除します。COLUMNキーワードはオプションです。DROP CONSTRAINT constraint-name
表定義から指定した列制約および表制約を削除します。DROP DEFAULT
表内の列のデフォルト値を削除(ドロップ)します。enable-clause
disable-clause
次のリストで説明する、全トリガー、指定したトリガー、全制約、指定した制約、主キー、または一意制約を有効または無効にできます。デフォルトでは、表変更操作時における表制約および列制約は有効になっています。
- DISABLE ALL TRIGGERS
表に対して定義されたすべてのトリガーが無効になります。(この表に対してトリガーが定義されていない場合でもエラーが発生しません。)- ENABLE ALL TRIGGERS
表に対して定義されたすべてのトリガーが有効になります。(この表に対してトリガーが定義されていない場合でもエラーが発生しません。)- DISABLE TRIGGER trigger-name
この表に対して指定されたトリガーが無効になります。指定されたトリガーは表で定義されている必要があります。- ENABLE TRIGGER trigger-name
この表に対して指定されたトリガーが有効になります。指定されたトリガーは表で定義されている必要があります。- DISABLE ALL CONSTRAINTS
この表に対する表制約および列制約がすべて無効になります。(この表で制約が定義されていない場合でもエラーが発生しません。)- ENABLE 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制約が有効になります。リストされた列は、表に対する一意制約内の列である必要があります。- VALIDATE and NOVALIDATE
ALTER TABLE文を使用して制約が追加または有効化される場合、デフォルトでは、表の内容が検証されます。ENABLE NOVALIDATEオプションを使用すると、熟練したデータベース管理者は、データが有効であるとわかれば、データの再検証に必要な時間とI/Oリソースを削減できます。
注意
RMU VerifyコマンドをConstraint修飾子とともに使用して、ENABLE NOVALIDATEオプションを使用する場合の仮定が正しいかどうかを定期的に確認することをお薦めします。
FOREIGN KEY column-name
変更する表(参照表)の外部キーとして宣言する列の名前です。IDENTITY
列が特殊な読取り専用識別列であることを指定します。INSERTによってこの列が評価され、挿入された各行の一意の値が格納されます。表の1列のみがIDENTITY属性を保持できます。Oracle Rdbにより、現在の表と同じ名前を持つ順序が作成されます。詳細は、「ALTER SEQUENCE文」および「CREATE SEQUENCE文」を参照してください。
increment-by
IDENTITY列に作成された順序の増分を指定する整数リテラル値です。負の値によって降順が、正の値によって昇順が作成されます。値ゼロは使用できません。デフォルト値の1が省略される場合、昇順になります。MODIFY (...)
この代替構文は、Oracle RDBMSとの互換性を目的として追加されます。NOT NULL
列の値をNULL以外の値に制限します。NULL
列に対してNULLが使用できることを指定します。これがデフォルトの動作です。同じALTER TABLE文の中で、NULL制約を持つ列に、NOT NULL制約も持たせることはできません。ただし、CHECK制約に対してチェックが実行されないため、列がNULL以外の値に制限される可能性があります。NULL制約はデータベースに格納されず、NOT NULLの構文上の代替としてのみ提供されます。
ALTER TABLE ... ALTER COLUMNで使用される場合、この句により、列に対して定義されたNOT NULL制約が削除されます。
PRIMARY KEY
主キー制約により、その値によって表内の行を他の行とは区別する1つ以上の列が定義されます。SQLでは主キー列の値が一意でありNULLではないことを必要とします。したがって、主キー列に対してUNIQUE列制約およびNOT NULL列制約を指定する必要はありません。算出列には主キー制約を指定できません。
表制約として使用する場合は、列名のリストをこの句の後に付ける必要があります。列制約として使用する場合は、この句を表の指定された列に適用します。
referenced-column-name
列制約では、被参照表の一意キーまたは主キーの列名です。表制約では、被参照列名が被参照表の一意キーまたは主キーである列の名前です。referenced-column-name句を省略すると、デフォルトで主キーが選択されます。references-clause
一意キーまたは主キーの列名、または被参照表の列名を指定します。表制約としてREFERENCES句が使用される場合は、FOREIGN KEY句で指定される列名が参照表の外部キーになります。