テーブルを変更します。
Synopsis
ALTER TABLE table alter-table-action
where alter-table-action is one of the following:
ADD add-action
DROP drop-action
DELETE drop-action
ALTER [COLUMN] identifier alter-column-action
MODIFY modification-spec
add-action ::=
[CONSTRAINT table]
[(] FOREIGN KEY identifier (identifier-commalist)
REFERENCES table (identifier-commalist)
[triggered-action] [)]
|
[(] UNIQUE (identifier-commalist)
|
[(] PRIMARY KEY identifier (identifier-commalist) [)]
|
DEFAULT [(] default-spec [)] FOR identifier
|
[COLUMN] [(] identifier datatype
{%ALPHAUP | %EXACT | %SQLSTRING [(literal)] |
%SQLUPPER [(literal)] | %UPPER | %STRING [(literal)] |
%DESCRIPTION literal | DEFAULT [(] default-spec [)] |
field-constraint
} [)]
drop-action ::=
FOREIGN KEY identifier |
PRIMARY KEY |
CONSTRAINT identifier |
[COLUMN] identifier [RESTRICT | CASCADE]
alter-column-action ::=
SET DEFAULT [(]default-spec[)] |
DEFAULT [(]default-spec[)] |
DROP DEFAULT |
NULL |
NOT NULL |
datatype
modification-spec ::=
identifier [datatype]
[DEFAULT [(]default-spec[)]]
[CONSTRAINT identifier] [NULL] [NOT NULL]
ALTER TABLE コマンドは特権を必要とする操作です。
ALTER TABLE を使用する前に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER オブジェクト特権があることを確認する必要があります。特権がない場合は、SQLCODE 99 エラー (特権違反) が返されます。適切な特権を持っている場合は、
GRANT コマンドを使用して %ALTER_TABLE 特権または %ALTER 特権を割り当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
-
その名前の列がすでに存在している場合、この文は失敗し SQLCODE -306 エラーが発生します。
-
この文で、列に NOT NULL 制約を設定し、
さらに既定値を設定しない場合、そのテーブルにすでにデータがあると、この文はエラーになります。これは、DDL 文が完了した後では NOT NULL 制約は既存の行すべてを満たさないためです。その結果、
エラー・コード SQLCODE -304 が生成されますが、これはデータが存在するテーブルに、既定値のない NOT NULL フィールドを追加しようとするためです。
-
この文で、列に NOT NULL 制約を設定し、さらに既定値を設定した場合、テーブルにある既存の行は更新され、追加したフィールドの列には設定した既定値が割り当てられます。
-
この文で、列に NOT NULL 制約を設定せず、既定値を設定した場合は、既存のどの行の列でもデータは更新されません。これらの行に対する列の値は NULL です。
-
テーブルにデータがない場合は、指定した列の定義がそのテーブルに追加されます。
データが含まれている列のデータ型を変更することでストリーム・データが非ストリーム・データになる場合、または非ストリーム・データがストリーム・データになる場合、そのデータ型変更は実行できません。この変更を実行しようとすると、SQLCODE エラー・コード -374 が発生します。列に既存のデータがない場合は、この変更が可能です。
一意でないデータを含むフィールド、または NULL 値の入力が認められているフィールドには、主キー制約を追加できません。
既存のフィールドに主キー制約を追加する場合、フィールドが自動的に IDKey インデックスとして定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの方法で設定されているかどうかによります。
-
-
ObjectScript $SYSTEM.SQL.SetDDLPKeyNotIDKey() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。
-
このオプションが
偽 (false) (0) に設定されていて、このフィールドにデータがない場合、主キー・インデックスは IDKey インデックスとして定義されます。このオプションが
偽 (false) に設定されていて、このフィールドにデータが
ある場合、IDKey インデックスは定義されません。
主キーがすでに定義されているテーブルに他の主キーを作成しようとすると、設定によって結果が異なります。既定で、主キーがすでに存在する場合、Caché は主キーの定義を拒否し、SQLCODE -307 エラーを返します。この振る舞いは、以下のように設定します。
-
ObjectScript $SYSTEM.SQL.SetDDLNo307() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、
[SQLCODE=-307 エラーの抑制] の設定が表示されます。
-
このオプションが "真" (true) に設定されていると、
ALTER TABLE ADD PRIMARY KEY により、Caché は主キー・インデックスをクラス定義から削除し、指定の主キー・フィールドを使用したインデックスを再生成します。
ただし、既存の主キーが存在する状態で主キーを作成できるようにこのオプションを設定していても、テーブルにデータがある場合は、IDKey インデックスを兼ねる主キー・インデックスは再作成できません。これを実行しようとすると、SQLCODE -307 エラーが返されます。
既定では、同じ名前の 2 つの外部キーを持つことはできません。これを実行しようとすると、SQLCODE = -311 エラーが返されます。このオプションは設定可能です。
-
ObjectScript $SYSTEM.SQL.SetDDLNo311() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、
[SQLCODE=-311 エラーの抑制] の設定が表示されます。
-
既定は
偽 (false) (0) です。この設定を推奨します。真 (true) の場合、同じ名前が存在しても、DDL を使用して外部キーを追加できます。偽 (false) の場合は、上記の操作を実行すると、-311 エラー・コードが返されます。
外部キー制約によって参照されている一意キー制約または主キー制約は削除できません。削除しようとすると、SQLCODE -317 エラーが返されます。
主キー制約の削除による影響は、上記のように [Are Primary Keys ... also ID Keys] 設定の内容によって異なります。
-
PrimaryKey インデックスが IDKey インデックスを兼ねていない場合、主キー制約を削除すると PrimaryKey インデックスの定義が削除されます。
-
PrimaryKey インデックスが IDKey インデックスを兼ねていて、テーブルにデータがない場合、主キー制約を削除するとインデックスの定義全体が削除されます。
-
PrimaryKey インデックスが IDKey インデックスを兼ねていて、テーブルにデータが
ある場合、主キー制約を削除すると、IDKey インデックスの定義から PRIMARYKEY 修飾子のみが削除されます。
制約を持たないフィールドのフィールド制約を削除しようとした場合、構成設定によって結果が異なります。
-
ObjectScript $SYSTEM.SQL.SetDDLNo315() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、
[SQLCODE=-315 エラーの抑制] の設定が表示されます。
-
既定は
偽 (false) (0) です。既定で、制約が存在しない場合、Caché は制約の削除を拒否し、SQLCODE -315 エラーを返します。しかし、"はい" に設定されていると、
ALTER TABLE DROP CONSTRAINT により、Caché は処理を実行せず、エラー・メッセージを発行しません。
以下の例では 2 つの埋め込み SQL プログラムを使用して、テーブルを作成し、2 行を生成してからテーブルの定義を変更します。
ALTER TABLE コマンドは FavoriteColors 列を作成し、その列で既存の 2 つの行に対応するフィールドに値 'Blue' を入力します。
この動作をはっきり示すために、2 つの埋め込み SQL プログラムは示されている順序で実行してください (埋め込み SQL では参照されるテーブルがすでに存在していなければ
INSERT 文をコンパイルすることができないため、ここでは 2 つの埋め込み SQL プログラムを使用する必要があります)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(DROP TABLE Sample.PTest)
WRITE !,"Deleted table, SQLCODE=",SQLCODE
&sql(CREATE TABLE Sample.PTest (
Id INT NOT NULL,
Name VARCHAR(35),
DOB DATE,
CONSTRAINT PTestPK PRIMARY KEY (Id) )
)
WRITE !,"Created table, SQLCODE=",SQLCODE
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(INSERT INTO Sample.PTest (Id, Name, DOB)
VALUES (1, 'David Vanderbilt', 46639))
WRITE !,"Insert data in table, SQLCODE=",SQLCODE
&sql(INSERT INTO Sample.PTest (Id, Name, DOB)
VALUES (2, 'Mary Smith', 49759))
WRITE !,"Insert data in table, SQLCODE=",SQLCODE
&sql(ALTER TABLE Sample.PTest
ADD COLUMN FavoriteColor %String NOT NULL DEFAULT 'Blue')
IF SQLCODE=0 {
WRITE !,"Altered table, SQLCODE=",SQLCODE }
ELSEIF SQLCODE=-306 {
WRITE !,"Column already exists, SQLCODE=",SQLCODE }
ELSE { WRITE "SQLCODE error=",SQLCODE }
データを表示するには、システム管理ポータルで SAMPLES ネームスペースの [グローバル] オプションを選択します。"Sample.PTestD" までスクロールし、[データ] オプションをクリックします。