テーブルを作成します。
Synopsis
CREATE TABLE table (table-element-commalist)

table-element ::= 
     [%DESCRIPTION string] |
     [%FILE string] |
     [%NUMROWS integer] |
     [%ROUTINE string] 

     { fieldname datatype
           [IDENTITY] |
          {
          UNIQUE | NULL | NOT NULL | 
          DEFAULT [(]default-spec[)] |
          [COLLATE] sqlcollation |
          %DESCRIPTION literal
          } , }

     [CONSTRAINT identifier] 
          UNIQUE (identifier-commalist) |
     [CONSTRAINT identifier] 
          PRIMARY KEY (identifier-commalist) | 
     [CONSTRAINT identifier] 
          FOREIGN KEY (identifier-commalist) REFERENCES table 
               (identifier-commalist) [triggered action] 

sqlcollation::=
          %ALPHAUP | 
          %EXACT | 
          %MINUS | 
          %PLUS | 
          %SPACE | 
          %SQLSTRING [(maxlen)] |
          %SQLUPPER [(maxlen)] | 
          %STRING [(maxlen)] |
          %UPPER
このコマンド概要には、互換性目的でのみ解析されオペレーションを伴わないキーワードは記載されていません。サポートされる空命令キーワードの一覧は、後述の別セクションで示します。
引数
table 作成するテーブルの名前。有効な識別子を指定します。テーブル名は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、システム既定のスキーマ名が使用されます。
table-element
1 つまたは複数のフィールド定義またはキーワード句のコンマ区切りリスト。
各フィールド定義の最も簡単な構成は、フィールド名 (有効な識別子として指定) と、それに続くデータ型です。
各キーワード句は、キーワードとそれに続くリテラルで構成します。
概要
CREATE TABLE コマンドは、指定された構成のテーブルを作成します。
CREATE TABLE コマンドの実行には特権が必要です。CREATE TABLE を使用する前に、%CREATE_TABLE 特権を得る必要があります。この操作をしないと、SQLCODE –99 エラー (特権違反) が返されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、%CREATE_TABLE 特権を割り当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
以下の埋め込み SQL の例は、Employee テーブルを作成します。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE TABLE Employee (
  EMPNUM     INT NOT NULL,
  NAMELAST   CHAR(30) NOT NULL,
  NAMEFIRST  CHAR(30) NOT NULL,
  STARTDATE  TIMESTAMP,
  SALARY     MONEY,
  ACCRUEDVACATION   INT,
  ACCRUEDSICKLEAVE  INT,
  CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM))
  )
  WRITE !,"SQL code is: ",SQLCODE
Employee という名前のこのテーブルには、いくつかの定義済みフィールドがあります。(会社の従業員の ID 番号を含む) EMPNUM フィールドは、NULL ではない整数です。また、テーブルの主キーとして宣言されています。従業員の姓と名にはそれぞれフィールドが定義され、どちらも最大 30 文字までの非 NULL 文字列で指定されます。また、従業員の入社日や有給休暇、病欠日のフィールド (TIMESTAMP と INT データ型を使用) もあります。
SQL セキュリティ有効/無効
%CREATE_TABLE 特権は GRANT コマンドで割り当てます。このときユーザまたはロールにこの特権を割り当てる必要があります。この要件は設定可能です。
既定は “真 (true)” (1) です。“真” (true) の場合、ユーザは特権が付与されているテーブルやビューのみでアクションを実行できます。この設定を推奨します。
このオプションが “偽 (false)” (0) に設定されている場合、SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、ダイナミック SQL はユーザとして "_SYSTEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。
テーブル名
テーブル名は、識別子の規則に従い、以下のような制約を受けます。既定では、テープル名は (フィールド名と同様に) 単純な識別子です。同じスキーマ内では、テーブルとビューに同じ名前を使用することはできません。テーブル名は 128 文字を超えることはできません。
テーブル名は修飾、未修飾のどちらでもかまいません。テーブル名を修飾する場合は、以下の構文を使用します。
schema.tablename
未修飾のテーブル名には、既定として SQLUser スキーマが使用されます (以下に示すように、このスキーマ名の使用については設定可能です)。例えば、上記の例では、未修飾のテーブル名 Employee からクラス User.Employee が生成されます。スキーマ名はクラス・パッケージ名となり、既定のクラス・パッケージ名は User です。スキーマ名と既定値の詳細は、"テーブル参照" を参照してください。
Caché はテーブル名を使用して、対応するクラス名を生成します。クラス名には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。このクラス名を生成するために、Caché は最初にテーブル名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、クラス名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。Caché は有効なテーブル名から一意のクラス名を生成しますが、テーブルの命名時には、この名前の生成に伴う以下の制約について考慮する必要があります。
Caché は Unicode システムで、16 ビット (ワイド) 文字列のテーブルやフィールドの名前付けをサポートします。$ZNAME テストに合格した文字は、有効な文字です。以下の埋め込み SQL の例に示すように、テーブル名にはアクセント記号付き文字を使用でき、生成されるクラス名にもアクセント記号が含まれます。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE TABLE ñáàéèíìóòúù (
  TESTNUM     INT NOT NULL,
  FIRSTWORD   CHAR (30) NOT NULL,
  LASTWORD    CHAR (30) NOT NULL,
  CONSTRAINT ñáàéèíìóòúùPK PRIMARY KEY (TESTNUM))
  )
  WRITE !,"SQL code is: ",SQLCODE
既定スキーマ名
未修飾のテーブル名には、既定として SQLUser スキーマが使用されます。この既定は設定可能です。現在のプロセスの既定スキーマ名を返すには、$SYSTEM.SQL.DefaultSchema() 関数を使用します。
  WRITE $SYSTEM.SQL.DefaultSchema()
既定スキーマ名を設定するには以下の方法があります。
既定のスキーマ名が使用されるのは、未修飾のテーブル名が SQL 文で出現し、#import 文が指定されていない場合です。この構成は、SQL スキーマ名とクラス・パッケージ名間のマッピングとは関係ありません。既定のスキーマ名を指定するだけです。既定スキーマ名に _CURRENT_USER を指定すると、この既定スキーマ名が現在ログインしているプロセスでのユーザ名になります。ログインしていなければ SQLUser が既定スキーマ名となります。既定スキーマ名に _CURRENT_USER または myname (ユーザが指定した文字列) を指定すると、これが現在ログインしているプロセスでのユーザ名になります。ログインしていなければ、myname が既定スキーマ名として使用されます。例えば、_CURRENT_USER または HMO は、プロセスがログインしていないときは既定のスキーマ名として HMO を使用します。
既存のテーブル
既存のテーブルと同じ名前のテーブルを作成しようとしたときの反応は、構成設定により異なります。既定では、Caché は既存のテーブルと同じ名前のテーブルを作成することを拒否し、SQLCODE -201 エラーを返します。これは以下のように設定可能です。
既定は “偽 (false)” (0) です。この設定を推奨します。このオプションを “真 (true)” (1) に設定すると、Caché はこのテーブルに対応するクラス定義を削除し、クラスを再作成します。つまり、DROP TABLE を実行して既存のテーブルを削除し、CREATE TABLE を実行する動作と同じ結果を生じます。この場合、SQL 構成オプションの [Does DDL DROP TABLE Delete the Table's Data]“真” (ture) に設定 (既定) することを強くお勧めします。
%DESCRIPTION、%FILE、%NUMROWS、%ROUTINE
これらのオプション・キーワード句は、テーブル要素のコンマ区切りリスト内の任意の場所で指定できます。
Caché SQL で提供されている %DESCRIPTION キーワードは、テーブルまたはフィールドの説明を挿入するために使用します。%DESCRIPTION の後には、一重引用符で囲んだテキスト文字列を続けます。このテキストの長さに制限はなく、空白スペースを含むすべての文字を使用できます (説明文字列内の一重引用符は、二重引用符で代用します。例えば、'Joe''s Table' のようになります)。1 つのテーブルには 1 つの %DESCRIPTION を使用できます。テーブルの各フィールドには、データ型の後にそれぞれ独自の %DESCRIPTION を指定できます。1 つのテーブルに対してテーブル全体の %DESCRIPTION を複数指定すると、SQLCODE –82 が返されます。1 つのフィールドに対して %DESCRIPTION を複数指定すると、最後に指定された %DESCRIPTION のみが保持されます。Caché スタジオでは、説明は、対応するテーブル (クラス) またはフィールド (プロパティ) の 1 つ前の行に、3 つのスラッシュが付けられて表示されます。以下はその例です。
/// Joe's Table
Caché SQL が提供する %FILE キーワードは、テーブルの説明を記録するファイル名を指定する目的で使用します。1 つのテーブルに使用できるのは 1 つの %FILE のみです。複数の %FILE を指定すると、SQLCODE –83 が返されます。
Caché SQL が提供する %NUMROWS キーワードは、このテーブルの予想される行数を示す整数を格納するのに使用されます。既知のデータ行数でテーブルが作成される場合、特に行数の初期値が以降に変更される可能性が低い場合 (都道府県のテーブルなど)、%NUMROWS を設定するとスペースを節約して、パフォーマンスを向上させることができます。1 つのテーブルに使用できるのは 1 つの %NUMROWS キーワードのみです。複数の %NUMROWS を指定すると、SQLCODE –84 が返されます。
Caché SQL が提供する %ROUTINE キーワードは、このベース・テーブルに対して生成されるルーチン名の接頭語を指定するのに使用できます。例えば、%ROUTINE "myname" では、myname1、myname2 というように以降も順次続く一連の名前のルーチンにコードが生成されます。外部関数は、%ROUTINE から呼び出せません。1 つのテーブルに使用できるのは 1 つの %ROUTINE のみです。複数の %ROUTINE を指定すると、SQLCODE –85 が返されます。Caché スタジオでは、ルーチン名の接頭語は SqlRoutinePrefix 値として表示されます。
互換性のみにサポートされるオプション
Caché SQL は、構文解析の目的にのみ以下の CREATE TABLE オプションをサポートし、既存の SQL コードから Caché SQL への変換を支援します。これらのオプションは、実際には機能しません。
{ON | IN} dbspace-name

LOCK MODE [ROW | PAGE]

[CLUSTERED | NONCLUSTERED]

WITH FILLFACTOR = literal

MATCH [FULL | PARTIAL]

CHARACTER SET identifier

COLLATE identifier  /* But note use of COLLATE keyword, described below */
TEMPORARY テーブル・オプション
SQL の実装とは異なり、Caché は TEMPORARY テーブルをサポートしません。CREATE TABLE によって作成されたすべてのテーブルは、永続的なテーブルです。詳細は、"CREATE VIEW" を参照してください。
フィールド定義
テーブル名の後に、括弧に囲まれたテーブルの全フィールド (列) 定義があります。フィールドの定義は、コンマで区切ります。規則によって、各フィールドの定義は通常、別の行にインデントされて表示されます。これは必須ではありませんがお勧めします。最後のフィールドを定義した後は、フィールド定義の閉じ括弧を必ず記述してください。
フィールド定義部分は空白で区切ります。フィールド名は最初に記述し、その後にそのデータ特性を続けます。フィールドのデータ特性は、データ型、データ・サイズ (オプション)、データ制約 (オプション) の順序に表示されます。
Note:
Caché では、400 列を超えるテーブルの作成はお勧めできません。400 列を超える場合は、データベースを設計し直します。これには、列を行に置き換える方法、列を複数の関連テーブルに分割する方法、データを文字ストリームまたはビット・ストリームとして保存し、列を減らす方法などがあります。
フィールド名
フィールド名は、識別子の規約に従い、テーブル名と同様の制約を受けます。フィールド名は 128 文字を超えることはできません。既定のフィールド名は、簡単な識別子です。
Caché はフィールド名を使用して、対応するプロパティ名を生成します。プロパティ名には英数字 (文字および数字) のみを使用し、その長さは最大 31 文字です。Caché は、このプロパティ名を生成するために、最初にフィールド名から句読点を削除し、次に 31 文字 (未満) の一意の識別子を生成します。その際、プロパティ名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。
データ型
Caché SQL は、多くの標準 SQL データ型をサポートしています。サポートされているデータ型の完全なリストは、"データ型" セクションを参照してください。
Caché は SQL.SystemDataTypes マッピング・テーブルおよび SQL.UserDataTypes マッピング・テーブルによって、これらの標準 SQL データ型を Caché データ型にマップします。ユーザは、追加のユーザ定義のデータ型を含めるために SQL.UserDataTypes を追加できます。
現在のデータ型マッピングを表示および変更するには、[システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストで [SQL] を選択します。[SystemDataTypes] または [UserDataTypes] の現在の値を表示するには、[内容] を選択します。
Caché に対応するデータ型がない SQL のデータ型を指定する場合、その SQL データ型の名前が、対応するクラス・プロパティのデータ型として使用されます。DDL の実行 (SQLExecute) 前に、このユーザ定義の Caché データ型を作成する必要があります。
また、データ型のマッピングは、1 つのパラメータ値を上書きできます。例えば、VARCHAR(100) を、与えられた %String(MAXLEN=100) 標準マッピングにマップしたくないとします。この場合、テーブルに 'VARCHAR(100)' の DDL データ型を追加して、これを上書きし、対応する Caché のタイプを指定します。以下はその例です。
VARCHAR(100) maps to MyString100(MAXLEN=100)
データ・サイズ
データ型の後に続けて、(precision,scale) のように括弧内で使用可能なデータ・サイズを表示できます。precision は、許可された最大文字数や桁数を表示します。scale は、小数桁数を指定します。例えば以下のようになります。
ProductName VARCHAR (64)
UnitPrice NUMERIC (6,2)
この例では、UnitPrice の最大許可サイズは 6 桁で、そのうち 2 桁は小数点以下の桁です。したがって、使用できる最高金額は $9999.99 になります。
IDENTITY フィールド
Caché SQL は各テーブルについて自動的に RowID を作成します。これはシステムが作成する整数値で、一意のレコード識別子となります (以下のセクションを参照)。この IDENTITY キーワード・オプションを使用すると、同じプロパティを持つ名前付きのフィールドを RowID レコード識別子フィールドとして定義できます。IDENTITY フィールドとして定義できるのは、1 テーブルに 1 つのフィールドです。複数の IDENTITY フィールドを定義しようとすると、SQLCODE -308 エラーが発生します。IDENTITY フィールドには以下のような特質があります。
以下は IDENTITY フィールドの例です。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE TABLE Employee (
  EmpNum INT NOT NULL,
  MyID   IDENTITY NOT NULL,
  Name   CHAR(30) NOT NULL,
  CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum))
  )
  IF SQLCODE'=0 {
    WRITE !,"CREATE TABLE error is: ",SQLCODE
    QUIT }
  ELSE {
  &sql(INSERT INTO Employee (EmpNum,Name) 
    SELECT ID,Name FROM Sample.Person WHERE Age >= '25')
  WRITE !,"INSERT error code is: ",SQLCODE }
この場合、主キー (EmpNum) は別のテーブルの ID フィールドから取得されます。したがって EmpNum の値は一意の整数になりますが、WHERE 節のため、数字が連続しない場合もあります。IDENTITY フィールドの MyID は、ユーザから可視の一意の連続した整数を、各レコードに割り当てます。
フィールドのデータ制約
データ制約によって、フィールドに許可される値、フィールドの既定値、およびデータ値に使用される照合タイプが規定されます。これらのデータ制約は、すべてオプションです。データ制約は、どのような順序でも指定できます。詳細は、"フィールド制約" を参照してください。
NULL と NOT NULL
NOT NULL データ制約キーワードは、そのフィールドが NULL 値を受け入れないように指定します。つまり、すべてのレコードがこのフィールドに対して指定された値を持つ必要があります。NULL と空文字列 ('') は、Caché では異なる値です。フィールドが NOT NULL 制約で定義されているとしても、文字列を受け入れるフィールドに空文字列を挿入することができます。数値フィールドに空文字列を挿入することはできません。詳細は、このドキュメントの "SQL の概念" の "NULL" のページを参照してください。
NULL データ制約キーワードは、このフィールドが NULL 値を受け入れることを明示的に指定します。これは、フィールドの既定の定義です。
UNIQUE
UNIQUE データ制約は、このフィールドが一意の値のみ受け入れることを指定します。したがって、このフィールドには同じ値を持つレコードは存在しないことになります。空文字列 ('') はデータ値とみなされるため、UNIQUE データ制約が適用されている場合は、このフィールドの複数のレコードを空文字列値にすることはできません。NULL はデータ値とみなされないため、UNIQUE データ制約は複数の NULL に対して適用されません。フィールドに対して NULL を制限するには、NOT NULL キーワード制約を使用します。
DEFAULT
レコードにユーザ指定のデータ値が上書きされていなければ、DEFAULT データ制約によって、このフィールドに自動的に与えられている既定データ値が指定されます。既定値として指定する文字列は定数で、一重引用符で囲みます。数値既定値には一重引用符は必要ありません。例えば以下のようになります。
Member_status CHAR(13) DEFAULT 'M',
Membership_term INT DEFAULT 2
DEFAULT が指定されていなければ、暗黙の既定は NULL になります。フィールドに NOT NULL データ制約があれば、このフィールドには明示的に、または DEFAULT で値を指定する必要があります。NOT NULL フィールドも含めてどのフィールドも、DEFAULT で空文字列を既定にすることができます。この場合、このフィールドには既定として常に $CHAR(0) の空文字列値が格納されます。NULL および空文字列の詳細は、このドキュメントの "SQL の概念" の "NULL" を参照してください。
DEFAULT データ制約には、その値を定義するキーワード・オプションを指定できます。サポートされているオプションは、NULL、USER、CURRENT_USER、SESSION_USER、SYSTEM_USER、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP です。
また、DEFAULT データ制約には OBJECTSCRIPT literal を指定することもできます。このオプションでは、以下の例に示すように、Caché ObjectScript コードを含む引用符付き文字列を指定することで既定値を生成できます。
CREATE TABLE mytest
(ID NUMBER(12,0) NOT NULL,
CREATE_DATE DATE DEFAULT OBJECTSCRIPT '+$HOROLOG' NOT NULL,
LOGNUM NUMBER(12,0) DEFAULT OBJECTSCRIPT '$INCREMENT(^LogNumber)')
詳細は、"Caché ObjectScript リファレンス" を参照してください。
照合パラメータ
オプションの照合パラメータは、フィールドの値のソート時に使用する照合タイプを指定します。Caché SQL は、9 タイプの照合をサポートします。プログラミングを明確にする目的で、照合パラメータの前にオプション・キーワードの COLLATE を指定することを推奨します。ただし、このキーワードは必須ではありません。照合を指定しない場合、既定は %EXACT 照合です。
%ALPHAUP、%SQLUPPER、%STRING、および %UPPER 照合は、照合目的ですべての文字を大文字に変換します。大文字と小文字を区別しない照合の詳細は、"%SQLUPPER" 関数を参照してください。
%SQLSTRING、%SQLUPPER、および %STRING 照合では、オプションの maxlen パラメータを使うことができます。これは切り捨てを命令する整数で、照合の実行時に対象とする最大文字数を指定します。このパラメータは、サイズの大きなデータ値を持つフィールドにインデックスを作成するときに便利です。
Caché SQL には、これらの照合タイプのほとんどに対応する関数があります。詳細は、"%ALPHAUP"、"%SQLSTRING"、"%SQLUPPER"、"%STRING"、"%UPPER" の各関数を参照してください。
%DESCRIPTION
フィールドには、説明用のテキストを追加できます。このオプションに適用される規則は、テーブルの説明テキストと同じです。それらの規則は、その他のテーブル要素とともに前述されています。
レコード識別子
SQL では、すべてのレコードは RowID という一意の値によって識別される必要があります。Caché SQL では、RowID フィールドを指定する必要はありません。テーブルを作成して希望のデータ・フィールドを指定するとき、追加の RowID フィールドが自動的に作成されます。この RowID は内部的に使用されますが、クラス・プロパティにマップはされません。これはクラスが SQL に投影される場合にのみ、表示されます。この投影された SQL では、追加の RowID フィールドが表示されます。ユーザが上書きしない限り、このフィールドは常に "ID" という名前です。
例えば、CREATE TABLE 文は Name、Age、Address の 3 つのフィールドを指定します。これに対応するクラスは、Name、Age、Address の 3 つのクラス・プロパティを持ちます。ただし、このクラスから投影される SQL は ID、Name、Age、Address の 4 つのフィールドを持ちます。
RowID に対して生成された値は、以下の制約を持っています。各値は一意です。NULL 値は許可されていません。照合は EXACT です。値は変更できません。
主キー
PRIMARY KEY 節を使用して、フィールドを主レコード識別子として明示的に定義することができます。主キーは一意の値のみを受け取り、NULL 値は受け取りません。主キーの照合タイプは、フィールドそのものの定義で指定されます。
定義されたフィールドを以下のように主キーとして指定します。
CREATE TABLE A1 (Field1 INT, Field2 INT, PRIMARY KEY (Field1))
定義済みの主キーを持つクラスが SQL に投影される場合、追加の "ID" という RowID フィールドが表示されます。その値は IDKEY フィールドの値と同じになります。
IDKey の主キー
CDL では、レコード識別子を IDKEY に指定することができます。多くの場合、SQL 主キーは CDL IDKEY に対応します。
既存のフィールドに主キー制約を追加する場合、フィールドが自動的に IDKey インデックスとして定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの方法で設定されているかどうかによります。
このオプションが“偽 (false)” (0) に設定されている場合、主キーは IDKEY に対応します。IDKEY である主キーを使用したレコードへのアクセスはより効率的ですが、一度設定されたキー値は二度と変更することはできません。
複数の主キー
主キーには、1 フィールドしか定義できません。テーブルに複数の主キーを指定しようとすると、設定によって結果が異なります。既定では、主キーがすでに存在する場合、Caché は主キーの定義を拒否し、SQLCODE -307 エラーを返します。この振る舞いは、以下のように設定します。
既定は “偽 (false)” (0) です。このオプションの設定が “偽 (false)” の場合、テーブルにすでに主キー制約が存在するのに DDL で主キー制約を追加しようとすると、Caché は SQLCODE -307 エラーを返します。主キーの第 2 定義が最初の定義と同じ場合もエラーを返します。
例えば、以下に CREATE TABLE 文があります。
CREATE TABLE MyTable (f1 VARCHAR(16), 
CONSTRAINT MyTablePK PRIMARY KEY (f1))
この文は、主キーを作成します (存在しない場合)。次に、ALTER TABLE 文があります。
ALTER TABLE MyTable ADD CONSTRAINT MyTablePK PRIMARY KEY (f1)
上記の例は、SQLCODE -307 エラーを返します。
[キーが存在する時に DDL を通して主キーを作成することを許可する]“真 (true)” に設定されている場合、Caché は既存の主キー制約を排除し、最後に指定された主キーをテーブルの主キーとして設定します。
外部キー
外部キーは他のテーブルを参照するフィールドです。外部キー・フィールドに保存された値は、他のテーブル内のレコードに対する主キー値です。指定された外部キーは必ず存在し、一意である必要があります (主キーは重複値を持てないため)。外部キーが存在しないテーブルを参照する場合は、SQLCODE=–310 が返されます。外部キーが一意でないフィールドを参照する場合は、SQLCODE=–314 が返されます。
テーブルに外部キーが含まれる場合は、1 つのテーブルでの変更が他のテーブルにも影響します。外部キーを定義するときにデータの整合性を維持するには、外部キーの元となっているレコードを変更したときに外部キー値に与える影響も定義します。
外部キー定義は、以下の 2 つの参照動作節を含みます。
ON DELETE ref-action
あるいは以下のコードを入力します。
ON UPDATE ref-action
ON DELETE 節は、参照されるテーブルに対する DELETE ルールを定義します。参照されるテーブルから行が削除されるとき、ON DELETE 節は参照しているテーブルの行に対してどのような操作を行うかを定義します。
ON UPDATE 節は、参照されるテーブルに対する UPDATE ルールを定義します。参照されるテーブルから行の主キー値を変更 (更新) しようとする場合、参照しているテーブルの行に対してどのように作用するかは ON UPDATE 節に定義します。
Caché SQL は以下の外部キー参照動作をサポートします。
NO ACTION — 参照されるテーブル内の行が削除されたり、キー値が更新されるとき、参照されるすべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。参照している行がある場合は、削除や更新は失敗します。NO ACTION は既定です。
SET NULL — 参照されるテーブル内の行が削除されたり、そのキー値が更新されるとき、参照されるすべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。参照している行がある場合は、削除や更新されている行を参照する外部キー・フィールドが NULL に設定されます。外部キー・フィールドは、NULL 値を許可します。
SET DEFAULT — 参照されるテーブル内の行が削除されたり、そのキー値が更新されるとき、参照されるすべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。参照している行がある場合は、削除や更新されている行を参照する外部キー・フィールドにそのフィールドの既定値が設定されます。外部キー・フィールドが既定値を持たない場合は、NULL に設定されます。行は参照されるテーブル内に存在しなければならないことに注意してください。また、参照されるテーブルには、既定値に対するエントリが含まれます。
CASCADE — 参照されるテーブル内の行が削除される場合、参照するすべてのテーブルでは、削除されている行を参照している行があるかどうかがチェックされます。参照している行がある場合は、削除によって、削除される行を参照している外部キー・フィールドの行も削除されます。
参照されるテーブル内のキー値が更新されるとき、参照するすべてのテーブルでは、更新される行を参照している行があるかどうかがチェックされます。参照している行がある場合は、更新によって、更新される行を参照する外部キー・フィールドの参照しているすべての行も続けて更新されます。
以下は、CREATE TABLE 文を発行する埋め込み SQL の例です。このコマンドは両方の参照動作節を使用します。
  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
  &sql(CREATE TABLE MyPatients (
     PatNum VARCHAR(16),
     Name VARCHAR(30),
     DOB DATE,
     Primary_Physician VARCHAR(16) DEFAULT 'A10001982321',
     CONSTRAINT Patient_PK PRIMARY KEY (PatNum),
     CONSTRAINT Patient_Physician_FK FOREIGN KEY
          Primary_Physician REFERENCES Physician (PatNum)
          ON UPDATE CASCADE
          ON DELETE SET NULL)
  )
  WRITE !,"SQL code: ",SQLCODE
関連項目