ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


ALTER SYNONYM文

シノニム定義を変更します。

環境

ALTER SYNONYM文は次の環境で使用できます。


形式



引数

COMMENT IS string

この句は、複数行のコメントをシノニム・オブジェクトに追加する場合に使用できます。SHOW SYNONYM文によって、コメントが表示されます。

この句は、COMMENT ON SYNONYM文と同義です。

FOR object-name

シノニムを、別のデータベース・オブジェクトを参照するように変更する場合がありますが、型が同じである必要があります。Oracle Rdbでは、オブジェクトが被参照オブジェクトと同じまたは同様の特性を持つことを想定しています。被参照オブジェクトは、データベースに存在している必要があります。

synonym-name

変更する既存のシノニムの名前です。

使用方法


例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文

既存の表定義が変更されます。次を実行できます。

ALTER TABLE文でも、表固有の制約を追加または削除できます。SHOW TABLE文を使用すると、表に現在関連付けられている制約の名前をすべて表示できます。制約は表レベルおよび列レベルの両方で、いくつでも削除および宣言できます。「ALTER CONSTRAINT文」および「DROP CONSTRAINT文」も参照してください。

この文を実行する場合、SQLにより表内の名前の付いた列定義が変更されます。指定しないすべての列は変更されないままです。制約を定義する前に、新しい列がSQLにより定義されます。次に、制約は、格納される前にSQLにより定義および評価されます。したがって、列および制約が同じ表定義内で定義される場合、制約は常に最新バージョンの列に適用されます。

表定義を変更すると、変更された定義を他のユーザーが参照できるのは、変更がコミットされた後にデータベースに接続した場合のみになります。


環境

ALTER TABLE文は次の環境で使用できます。


形式





















引数

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つのオプションと同じです。

表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句によって、表制約の名前が指定されます。この名前は、次のような様々な目的に使用されます。

CONSTRAINT句はオプションです。制約名を省略すると、SQLにより名前が作成されます。ただし、Oracle Rdbでは、列制約および表制約に常に名前を付けることをお薦めします。SQLによって作成された制約名はあいまいな可能性があります。CONSTRAINT句を使用して制約名を指定する場合、その名前はスキーマで一意である必要があります。

data-type

有効なSQLデータ型です。列に関連付ける明示的なデータ型の指定は、ドメイン名指定の代替手段です。

データ型の詳細は、第2.3節を参照してください。

列のデータ型を(ドメインの指定により直接的または間接的に)変更するためにALTER句を使用する場合は、次のような注意が必要です。

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文」を参照してください。

通常の目的には、明示的なデータ型ではなくドメインを指定します。

ただし、次の場合は、表の作成時にドメインを使用しないことをお薦めします。

DROP COLUMN column-name

指定した列を削除します。COLUMNキーワードはオプションです。

DROP CONSTRAINT constraint-name

表定義から指定した列制約および表制約を削除します。

DROP DEFAULT

表内の列のデフォルト値を削除(ドロップ)します。

enable-clause

disable-clause

次のリストで説明する、全トリガー、指定したトリガー、全制約、指定した制約、主キー、または一意制約を有効または無効にできます。デフォルトでは、表変更操作時における表制約および列制約は有効になっています。

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句で指定される列名が参照表の外部キーになります。