テーブルを変更します。
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]
引数
table 変更するテーブルの名前。
identifier 変更する列の名前。有効な識別子の詳細は、"SQL の概念" のページを参照してください。
datatype Caché SQL の有効なデータ型。有効なデータ型の詳細は、"SQL の概念" のページを参照してください。
default-spec このフィールドがユーザ指定のデータ値でオーバーライドされない場合に、このフィールドに自動的に入力される既定のデータ値。一重引用符で囲んだ文字列、数値、キーワード・オプション (NULL、CURRENT_USER、CURRENT_TIMESTAMP など)、OBJECTSCRIPT リテラルなどを指定できます。詳細は、"CREATE TABLE" を参照してください。
概要
ALTER TABLE 文は、要素の追加や削除または既存の要素の修正を行い、テーブルを変更します。1 つの ALTER TABLE 文で実行できる処理は、1 つのみです。ALTER TABLE DROP 文と ALTER TABLE DELETE 文は同義語です。
ALTER TABLE コマンドは特権を必要とする操作です。ALTER TABLE を使用する前に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER オブジェクト特権があることを確認する必要があります。特権がない場合は、SQLCODE –99 エラー (特権違反) が返されます。適切な特権を持っている場合は、GRANT コマンドを使用して %ALTER_TABLE 特権または %ALTER 特権を割り当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )
ALTER TABLE 文は table に対してテーブル・レベルのロックを取得します。これにより、他のプロセスはこのテーブルのデータを変更できなくなります。このロックは ALTER TABLE 操作が終了すると自動的に解除されます。
ADD COLUMN の制限
ALTER TABLE tablename ADD COLUMN 文を使用してテーブルにフィールドを追加することを考えます。
ALTER COLUMN の制限
データが含まれている列のデータ型を変更することでストリーム・データが非ストリーム・データになる場合、または非ストリーム・データがストリーム・データになる場合、そのデータ型変更は実行できません。この変更を実行しようとすると、SQLCODE エラー・コード -374 が発生します。列に既存のデータがない場合は、この変更が可能です。
ADD PRIMARY KEY の制限
一意でないデータを含むフィールド、または NULL 値の入力が認められているフィールドには、主キー制約を追加できません。
既存のフィールドに主キー制約を追加する場合、フィールドが自動的に IDKey インデックスとして定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの方法で設定されているかどうかによります。
このオプションが“偽” (false) (0) に設定されていて、このフィールドにデータがない場合、主キー・インデックスは IDKey インデックスとして定義されます。このオプションが“偽” (false) に設定されていて、このフィールドにデータがある場合、IDKey インデックスは定義されません。
主キーがすでに存在する場合に主キーを作成する
主キーがすでに定義されているテーブルに他の主キーを作成しようとすると、設定によって結果が異なります。既定で、主キーがすでに存在する場合、Caché は主キーの定義を拒否し、SQLCODE -307 エラーを返します。この振る舞いは、以下のように設定します。
既定は “偽 (false)” (0) です。ここでは、この設定を推奨します。
このオプションが "真" (true) に設定されていると、ALTER TABLE ADD PRIMARY KEY により、Caché は主キー・インデックスをクラス定義から削除し、指定の主キー・フィールドを使用したインデックスを再生成します。
ただし、既存の主キーが存在する状態で主キーを作成できるようにこのオプションを設定していても、テーブルにデータがある場合は、IDKey インデックスを兼ねる主キー・インデックスは再作成できません。これを実行しようとすると、SQLCODE -307 エラーが返されます。
ADD FOREIGN KEY の制限
既定では、同じ名前の 2 つの外部キーを持つことはできません。これを実行しようとすると、SQLCODE = -311 エラーが返されます。このオプションは設定可能です。
既定は “偽 (false)” (0) です。この設定を推奨します。真 (true) の場合、同じ名前が存在しても、DDL を使用して外部キーを追加できます。偽 (false) の場合は、上記の操作を実行すると、-311 エラー・コードが返されます。
DROP CONSTRAINT の制限
外部キー制約によって参照されている一意キー制約または主キー制約は削除できません。削除しようとすると、SQLCODE -317 エラーが返されます。
主キー制約の削除による影響は、上記のように [Are Primary Keys ... also ID Keys] 設定の内容によって異なります。
存在しない制約の削除
制約を持たないフィールドのフィールド制約を削除しようとした場合、構成設定によって結果が異なります。
既定は “偽 (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" までスクロールし、[データ] オプションをクリックします。
関連項目