ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース7.0
E05176-02
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

CREATE TABLE

CREATE TABLE文は、表を定義します。

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、この文にはDDL権限が必要です。

SQL構文

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName

(

    {{ColumnDefinition} [,...]

     [PRIMARY KEY (ColumnName [,...]) |

     [[CONSTRAINT ForeignKeyName]

        FOREIGN KEY ([ColumnName] [,...])

        REFERENCES RefTableName

             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]

     }

)

[UNIQUE HASH ON (HashColumnName [,...])

    PAGES = PrimaryPages]

[AGING {LRU|

         USE ColumnName

              LIFETIME Num1 {MINUTE[S] | HOUR[S] |DAY[S]}
              [CYCLE Num2 {MINUTE[S] |HOUR[S] |DAY[S]}]

        }[ON|OFF]

]

一時表の構文は、次のとおりです。

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName

(

    {{ColumnDefinition} [,...]

     [PRIMARY KEY (ColumnName [,...]) |

     [[CONSTRAINT ForeignKeyName]

        FOREIGN KEY ([ColumnName] [,...])

        REFERENCES RefTableName

             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]

      }

)

[UNIQUE HASH ON (HashColumnName [,...])

    PAGES = PrimaryPages]

[ON COMMIT { DELETE | PRESERVE } ROWS ]

パラメータ

CREATE TABLE文には、次のパラメータがあります。

[Owner.]TableName
新しい表に割り当てる名前です。2つの表に同じ所有者名と表名を指定することはできません。

所有者名を指定していない場合は、ログイン名が新しい表の所有者名になります。TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。Oracle表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。

名前作成の規則については、「基本名」を参照してください。
GLOBAL TEMPORARY

作成する表を一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

一時表は、キャッシュ・グループまたはレプリケーション・スキームの一部として使用できません。一時表は、DATASTOREレベルのレプリケーションが定義されるときに自動的に除外されます。

キャッシュ・グループ表は、一時表として定義できません。

一時表の変更は、XLAで追跡できません。

一時表の操作でログ・レコードが生成されますが、生成されるログの量は、永続表よりも少なくなります。

TRUNCATE TABLEは、グローバル一時表でサポートされていません。

ローカルの一時表は、サポートされていません。

ColumnDefinition
表の個々の列です。各表には、列が少なくとも1つ必要です。詳細は、「列定義」を参照してください。
ColumnName
作成される表の主キー列の名前を指定します。主キーには最大16列を指定できます。外部キーでは、ColumnNameはオプションです。外部キーが指定されていない場合は、親表の主キーを参照します。
PRIMARY KEY
PRIMARY KEYは、表定義に一度だけ指定します。これによって、1つ以上の列が表の主キーを構成していることを示します。主キーの内容は一意かつNOT NULLである必要があります。列には、UNIQUEと単一列PRIMARY KEYの両方を指定することはできません。
CONSTRAINT ForeignKeyName
オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。
FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストには新しい表の列を指定します。この列は参照元列と呼ばれます。2番目のリストには参照先の表の列を指定します。この列は参照先列と呼ばれます。これらの2つのリストのデータ型は、長さ、精度、スケールなどが同じである必要があります。参照先の表の参照先列には、あらかじめ主キーまたは一意索引を作成しておく必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列にTツリー索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 NO ACTIONの更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

[ON DELETE
CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

UNIQUE
列の各行の値が一意である必要があることを示します。
UNIQUE HASH ON
表のハッシュ索引です。一意のハッシュ索引のみが作成されます。このパラメータは、等価条件に使用します。詳細は、「説明」を参照してください。UNIQUE HASH ONを指定するには、主キーの定義が必要です。
HashColumnName
この表のハッシュ・キーに含まれるよう表で定義された列です。ハッシュ索引で定義された列は、主キーの列と同じである必要があります。
PrimaryPages
表の想定ページ数を指定します。この数値に基づいて、表のハッシュ索引に割り当てられるバケットの数が決まります。最小値は1です。想定したページ数が少なすぎると、パフォーマンスが低下します。
[ON COMMIT
{ DELETE | PRESERVE } ROWS]
グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。
[AGING LRU [ON | OFF]]

指定する場合、表のLRUエージング・ポリシーを定義します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

LRU属性はプロシージャttAgingLruConfigをコールして定義します。LRU属性はSQLレベルでは定義できません。

LRUエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

[AGING USE ColumnName...
[ON | OFF]]

指定する場合、表の時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLのTIMESTAMP型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。その結果がLIFETIME値より大きい場合、行はエージングの対象となります。

タイムスタンプ列の値は、アプリケーションによって更新されます。タイムスタンプ列の値が不明な行がある場合、その行が除去されないようにするには、タイムスタンプ列に大きなデフォルト値を定義します(列はNULLではありません)。

時間ベースのエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

LIFETIME Num1  {MINUTE[S]| HOUR[S] |
DAY[S]}

LIFETIMEは時間ベースのエージング属性で、必須の句です。

AGING USE ColumnName 句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。例5.65を参照してください。

[CYCLE Num2 {MINUTE[S] |HOUR[S] |
DAY[S]}]

CYCLEは時間ベースのエージング属性で、オプションです。LIFETIME句の後にCYCLE句を指定します。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定すると、エージングは継続され、エージング・スレッドがスリープ状態になることはありません。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

列定義

SQL構文

ColumnName ColumnDataType

 [DEFAULT DefaultVal]

 [[NOT] INLINE]

 [PRIMARY KEY | UNIQUE |

 NULL [UNIQUE] |

 NOT NULL [PRIMARY KEY | UNIQUE] ]

パラメータ

列定義には、次のパラメータがあります。

ColumnName
新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。表には最大255の列を定義できます。
DEFAULT
DefaultVal
INSERTで、列の値が指定されていない場合、デフォルト値DefaultValを列に挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。
DefaultValの有効なデータ型は、次のいずれかです。
ConstantValue: 詳細は、 「定数」を参照してください。
デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHARのいずれかであり、列の幅は30文字以上である必要があります。
ColumnDataType
列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型については、「データ型」を参照してください。
INLINE |
NOT INLINE
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。
NULL
列にNULL値を含めることができます。
NOT NULL
列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。
UNIQUE
列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意のTツリー索引が作成されます。これは、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があることを意味します。PRIMARY KEYとともに使用することはできません。
PRIMARY KEY
列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。また、UNIQUEとともに使用することはできません。

説明

例5.54

Tツリー索引は、主キーであるPartNumberに作成されます。

Command> CREATE TABLE Price

> (PartNumber INTEGER NOT NULL PRIMARY KEY,

> VendorNumber INTEGER NOT NULL,

> VendPartNum CHAR(20) NOT NULL,

> UnitPrice DECIMAL(10,2),

> DeliveryDays SMALLINT,

> DiscountQty SMALLINT);

Command> indexes price;

Indexes on table SAMPLEUSER.PRICE:

PRICE: unique T-tree index on columns:

   PARTNUMBER

1 index found.

1 table found.

例5.55

ハッシュ索引は、主キーであるClubName列に作成されます。

CREATE TABLE Recreation.Clubs

(ClubName CHAR(15) NOT NULL PRIMARY KEY,

 ClubPhone SMALLINT,

 Activity CHAR(18))

UNIQUE HASH ON (ClubName) PAGES = 30;

例5.56

Tツリー索引は、2つの列MemberNameおよびClubで作成されます(共に主キーであるため)。

Command> CREATE TABLE Recreation.Members

> (MemberName CHAR(20) NOT NULL,

>  Club CHAR(15) NOT NULL,

>  MemberPhone SMALLINT,

>   PRIMARY KEY (MemberName, Club));

Command> indexes recreation.members;

Indexes on table RECREATION.MEMBERS:

  MEMBERS: unique T-tree index on columns:

    MEMBERNAME

    CLUB

  1 index found.

1 table found.

例5.57

Recreation.Events表にはハッシュ索引は作成されません。

CREATE TABLE Recreation.Events

(SponsorClub CHAR(15),

 Event CHAR(30),

 Coordinator CHAR(20),

 Results VARBINARY(10000));

例5.58

ハッシュ索引は、VendorNumber列に作成されます。

CREATE TABLE Purchasing.Vendors

(VendorNumber INTEGER NOT NULL PRIMARY KEY,

 VendorName CHAR(30) NOT NULL,

 ContactName CHAR(30),

 PhoneNumber CHAR(15),

 VendorStreet CHAR(30) NOT NULL,

 VendorCity CHAR(20) NOT NULL,

 VendorState CHAR(2) NOT NULL,

 VendorZipCode CHAR(10) NOT NULL,

 VendorRemarks VARCHAR(60))

UNIQUE HASH ON (VendorNumber) PAGES = 101;

例5.59

ハッシュ索引は、列MemberNameおよびClubで作成されます(共に主キーであるため)。

CREATE TABLE Recreation.Members

     (MemberName CHAR(20) NOT NULL,

        Club CHAR(15) NOT NULL,

        MemberPhone SMALLINT,

        PRIMARY KEY (MemberName, Club))

    UNIQUE HASH ON (MemberName, Club) PAGES = 100;

例5.60

ハッシュ索引は、列FirstNameおよびLastNameに作成されます(共にAuthors表の主キーであるため)。

外部キーは、Authors表の主キーを参照するBooks表のAuthorFirstNameとAuthorLastName列に作成されます。

CREATE TABLE Authors

    (FirstName VARCHAR(255) NOT NULL,

        LastName VARCHAR(255) NOT NULL,
        Description VARCHAR(2000),

        PRIMARY KEY (FirstName, LastName))

    UNIQUE HASH ON (FirstName, LastName) PAGES=20;

CREATE TABLE Books
    (Title VARCHAR(100),
    AuthorFirstName VARCHAR(255),
    AuthorLastName VARCHAR(255),

    Price DECIMAL(5,2),

    FOREIGN KEY (AuthorFirstName, AuthorLastName)
    REFERENCES Authors(FirstName, LastName));

例5.61

次の文では、VARCHAR列のデフォルト文字が優先され、1つのVARCHAR (10)列がNOT INLINEで、1つのVARCHAR (144)がINLINEである表が作成されます。

CREATE TABLE t1

    (c1 VARCHAR(10) NOT INLINE NOT NULL,

    c2 VARCHAR(144) INLINE NOT NULL);

例5.62

次の文では、本のタイトルのUNIQUE列を持つ表が作成されます。

CREATE TABLE Books

    (Title VARCHAR(100) UNIQUE,

        AuthorFirstName VARCHAR(255),

        AuthorLastName VARCHAR(255),

        Price DECIMAL(5,2),

        FOREIGN KEY (AuthorFirstName, AuthorLastName)

        REFERENCES Authors(FirstName, LastName));

例5.63

次の文では、列x1のデフォルト値が1で、列dのデフォルト値がSYSDATEである表が作成されます。

CREATE TABLE t1

    (x1 INT DEFAULT 1, d TIMESTAMP DEFAULT SYSDATE);

この例では、TtreeEx表を作成し、主キーとしてCol1を定義します。Tツリー索引はデフォルトで作成されます。

Command> create table TtreeEx (Col1 TT_INTEGER PRIMARY KEY);

Command> INDEXES TtreeEx;

Indexes on table SAMPLEUSER.TTREEEX:

  TTREEEX: unique T-tree index on columns:

    COL1

  1 index found.

1 table found.

例5.64

次の文は、HRスキーマの親表および子表におけるON DELETE CASCADE句の使用を示しています。外部キーを持つ表は、ON DELETE CASCADEが有効に変更されています。

ALTER TABLE countries

ADD CONSTRAINT countr_reg_fk

         FOREIGN KEY (region_id)

           REFERENCES regions(region_id) ON DELETE CASCADE;

ALTER TABLE locations

     ADD CONSTRAINT loc_c_id_fk

          FOREIGN KEY (country_id)

             REFERENCES countries(country_id) ON DELETE CASCADE;

ALTER TABLE departments

     ADD CONSTRAINT dept_loc_fk

         FOREIGN KEY (location_id)

           REFERENCES locations (location_id) ON DELETE CASCADE;

ALTER TABLE employees

     ADD CONSTRAINT     emp_dept_fk

         FOREIGN KEY (department_id)

           REFERENCES departments ON DELETE CASCADE;

ALTER TABLE employees

     ADD CONSTRAINT     emp_job_fk

         FOREIGN KEY (job_id)

           REFERENCES jobs (job_id);

ALTER TABLE job_history

     ADD CONSTRAINT     jhist_job_fk

         FOREIGN KEY (job_id)

           REFERENCES jobs;

ALTER TABLE job_history

     ADD CONSTRAINT     jhist_emp_fk

         FOREIGN KEY (employee_id)

           REFERENCES employees ON DELETE CASCADE;

ALTER TABLE job_history

     ADD CONSTRAINT     jhist_dept_fk

         FOREIGN KEY (department_id)

           REFERENCES departments ON DELETE CASCADE;

     ;

例5.65

この例は、エージングにおいて、時間の単位がどのように機能するかを示しています。

存続時間が3 Daysの場合(単位はDay):

例5.66

この例では、LRUエージングを使用して表を作成します。エージング状態は、デフォルトでONになっています。

CREATE TABLE AgingDemo

       (AgingId NUMBER NOT NULL PRIMARY KEY

        ,Name  VARCHAR2 (20)

       )

       AGING LRU;

Command> DESCRIBE AgingDemo;

Table USER.AGINGDEMO:

  Columns:

     *AGINGID NUMBER NOT NULL

     NAME VARCHAR2 (20) INLINE

     AGING LRU ON

1 table found.

(primary key columns are indicated with *)

例5.67

この例では、時間ベースのエージングを使用する表を作成します。存続期間は3 Daysで、サイクルは指定されていないため、デフォルトで5分です。エージング状態はOFFです。

CREATE TABLE AgingDemo2

       (AgingId NUMBER NOT NULL PRIMARY KEY

        ,Name  VARCHAR2 (20)

        ,AgingColumn TIMESTAMP NOT NULL

        )

        AGING USE AgingColumn LIFETIME 3 DAYS OFF;

Command> DESCRIBE AgingDemo2;

Table USER.AGINGDEMO2:

  Columns:

     *AGINGID NUMBER NOT NULL

     NAME VARCHAR2 (20) INLINE

     AGINGCOLUMN TIMESTAMP (6) NOT NULL

  Aging use AGINGCOLUMN lifetime 3 days cycle 5 minutes off

1 table found.

(primary key columns are indicated with *)

例5.68

この例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE AgingDemo2

        (AgingId NUMBER NOT NULL PRIMARY KEY

        ,Name  VARCHAR2 (20)

        ,AgingColumn TIMESTAMP NOT NULL

        )

        AGING USE AgingColumn LIFETIME 3 DAYS OFF;

ALTER TABLE AgingDemo2

        ADD AGING LRU;

2980: Cannot add aging policy to a table with an existing aging policy. Have to drop the old aging first

The command failed.

DROP aging on the table and redefine with LRU aging.

ALTER TABLE AgingDemo2

        DROP AGING;

ALTER TABLE AgingDemo2

        ADD AGING LRU;

Command> DESCRIBE AgingDemo2;

Table USER.AGINGDEMO2:

  Columns:

   *AGINGID                         NUMBER NOT NULL

    NAME                            VARCHAR2 (20) INLINE

    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL

  Aging lru on

1 table found.

(primary key columns are indicated with *)

関連項目

ALTER TABLE
DROP TABLE
TRUNCATE TABLE
UPDATE