Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

CREATE TABLE (SQL)

テーブル定義を作成します。

Synopsis

基本的なテーブルの作成

CREATE TABLE [IF NOT EXISTS] table (column type, column2 type2, ...)
CREATE TABLE [IF NOT EXISTS] table AS SELECT query ... 
列の制約

CREATE TABLE table (column type NOT NULL, ...) CREATE TABLE table (column type UNIQUE, ...) CREATE TABLE table (UNIQUE (column, column2, ...), ...) CREATE TABLE table (..., CONSTRAINT uniqueName UNIQUE (column, column2, ...)) CREATE TABLE table (column type PRIMARY KEY, ...) CREATE TABLE table (..., PRIMARY KEY (column, column2, ...)) CREATE TABLE table (..., CONSTRAINT pKeyName PRIMARY KEY (column, column2, ...)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (column) REFERENCES refTable (refColumn)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (column, column2, ...) REFERENCES refTable (refColumn, refColumn2, ...)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES refTable)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... ON UPDATE refAction)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... ON DELETE refAction)) CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... NOCHECK))
特殊な列と列のプロパティ

CREATE TABLE table (column type DEFAULT defaultSpec, ...) CREATE TABLE table (column type COMPUTECODE [OBJECTSCRIPT | PYTHON ] {code}, ...) CREATE TABLE table (column type COMPUTECODE ... {code} COMPUTEONCHANGE (column, column2, ...), ...) CREATE TABLE table (column type COMPUTECODE ... {code} CALCULATED, ...) CREATE TABLE table (column type COMPUTECODE ... {code} TRANSIENT, ...)  CREATE TABLE table (column type ON UPDATE updateSpec, ...) CREATE TABLE table (column type IDENTITY, ...) CREATE TABLE table (column type AUTO_INCREMENT, ...) CREATE TABLE table (column SERIAL, ...) CREATE TABLE table (column ROWVERSION, ...) CREATE TABLE table (..., %DESCRIPTION description) CREATE TABLE table (column type %DESCRIPTION description, ...) CREATE TABLE table (%PUBLICROWID, ...) CREATE TABLE table (column type COLLATE sqlCollation, ...)
テーブルのオプション

CREATE TABLE table ...  SHARD CREATE TABLE table ... SHARD KEY (shardKeyColumn, shardKeyColumn2, ...) CREATE TABLE table ... SHARD KEY (coshardKeyColumn) COSHARD WITH (coshardTable) CREATE GLOBAL TEMPORARY TABLE table ...  CREATE TABLE table ... WITH %CLASSPARAMETER pName = pValue, %CLASSPARAMETER pName2 = pValue2, ...

概要

CREATE TABLE コマンドは、指定された構造のテーブル定義を作成します。CREATE TABLE は、SQL テーブルと対応する InterSystems IRIS® クラスの両方を作成します。詳細は、"作成したテーブルのクラス定義" を参照してください。

Note:

これらの構文には、互換性目的でのみ解析されオペレーションを伴わないキーワードは記載されていません。このようなキーワードの詳細は、"互換性のみにサポートされるオプション" を参照してください。

基本的なテーブルの作成

列の定義とそのデータ型を指定することで、テーブルを作成できます。または、CREATE TABLE AS SELECT クエリを使用して、列の定義とデータを既存のテーブルからコピーできます。

  • CREATE TABLE [IF NOT EXISTS] table (column type, column2 type2, ...) は、それぞれデータ型が指定された、1 つ以上の列を含むテーブルを作成します。

    この文は、2 つの列を含むテーブルを作成します。最初の列は、最大 30 文字の文字列値を受け入れます。2 つ目の列は有効な日付を受け入れます。

    CREATE TABLE Sample.Person (
        Name VARCHAR(30),
        DateOfBirth TIMESTAMP)

    例: テーブルの作成および生成

  • CREATE TABLE [IF NOT EXISTS] table AS SELECT query ... は、指定された SELECT クエリに基づいて、既存のテーブルから列の定義および列のデータを新しいテーブルにコピーします。SELECT クエリでは、テーブルまたはビューの任意の組み合わせを指定できます。関連の節を指定することで、STORAGETYPE%CLASSPARAMETER、または シャード・テーブルを指定することもできます。

    以下の文は、Sample.People テーブルのデータの一部から、新しいテーブル Sample.YoungPeople を列指向ストレージ・タイプで作成します。

    CREATE TABLE Sample.YoungPeople
    AS SELECT Name,Age
    FROM Sample.People
    WHERE Age < 21
    WITH STORAGETYPE = COLUMNAR
    
    

テーブルを作成するとき、IF NOT EXISTS 条件を指定できます。これにより、table が既に存在する場合のエラーを抑制できます。詳細は、既存のテーブルのチェック方法に関する以下のセクションを参照してください。

列の制約

列の制約によって、列に許可される値、列の既定値、および列の値が一意である必要があるかどうかを規定します。また、列の主キーと外部キーの制約も定義できます。列ごとに複数の列制約を、任意の順序で指定できます。列制約を区切るにはスペースを使用します。

NOT NULL 制約

  • CREATE TABLE table (column type NOT NULL, ...) では、指定された列のすべてのレコードに値が定義されている必要があります。つまり、NULL 値にすることはできません。

    この文は、いずれの列も null にすることができないテーブルを作成します。

    CREATE TABLE Sample.Person (
        Name VARCHAR(30) NOT NULL,
        DateOfBirth TIMESTAMP NOT NULL)

    空の文字列 ('') は null 値と見なされません。列が NOT NULL 制約で定義されているとしても、文字列を受け入れる列に空文字列を挿入することができます。

    NULL データ制約キーワード (NOT なし) は、この列が null 値を受け入れることを明示的に指定します。これは列に対する既定の定義です。

DEFAULT 制約

  • CREATE TABLE table (column type DEFAULT defaultSpec, ...) は、この列のデータ値が INSERT で指定されていない場合に、INSERT の処理で自動的にこの列に指定する既定のデータ値を指定します。DEFAULT 値と NOT NULL 制約の両方が指定されている列に INSERT 処理で NULL 値の挿入を指定すると、その列には DEFAULT 値が使用されます。この列で NOT NULL 制約が定義されていない場合は、DEFAULT 値ではなく NULL 値が使用されます。

    この文は、MembershipStatus 列および MembershipTerm 列に既定値を設定します。

    CREATE TABLE Sample.Member (
        MemberId INT NOT NULL,
        MembershipStatus CHAR(13) NOT NULL DEFAULT 'M',
        MembershipTerm INT NOT NULL DEFAULT 2)

UNIQUE 制約

UNIQUE 制約が指定されている場合は、一意の値のみを列に指定できます。どの列に UNIQUE 制約が設定されているかを確認するには、"テーブルのカタログの詳細" を参照してください。

  • CREATE TABLE table (column type UNIQUE, ...) は、指定された列が一意の値のみを受け入れるよう制約を加えます。この列には同じ値を持つレコードは存在しないことになります。

    この文は、UserName 列に対して UNIQUE 制約を設定します。

    CREATE TABLE Sample.People (
        UserName VARCHAR(30) UNIQUE NOT NULL,
        FirstName VARCHAR(30),
        LastName VARCHAR(30))

    SQL では、空文字列 ('') はデータ値と見なされるため、UNIQUE データ制約が適用されている場合は、複数のレコードでこの列を空文字列値にすることはできません。NULL はデータ値と見なされないため、UNIQUE データ制約は複数の NULL に対して適用されません。列に対して NULL を制限するには、NOT NULL キーワード制約を使用します。

    Note:

    シャード・テーブルでは、UNIQUE 制約によって挿入および更新のパフォーマンス・コストが大幅に増大します。挿入または更新のパフォーマンスが重要である場合、この制約を使用しないか、テーブルのシャード・キーを含めてください。シャード・テーブルには、UNIQUE 制約に関する追加の制限事項があることに注意してください。

    クエリ・パフォーマンスの詳細は、"一意制約の評価" および "シャード・クラスタにおけるクエリ" を参照してください。

  • CREATE TABLE table (UNIQUE (column, column2, ...), ...) では、列の指定されたグループのすべての値を 1 つに連結した場合にその値が一意の値であることが求められます。個々の列が一意である必要はありません。定義する列のコンマ区切りリストで、任意の場所にこの制約を指定できます。

    この文では、作成されたテーブル内の FirstNameLastName のレコードが一意であることが必要ですが、FirstNameLastName のレコードにそれぞれ重複が含まれていてもかまいません。

    CREATE TABLE Sample.People (
        FirstName VARCHAR(30),
        LastName VARCHAR(30),
        UNIQUE (FirstName,LastName))
  • CREATE TABLE table (..., CONSTRAINT uniqueName UNIQUE (column,column2, ...)) は、UNIQUE 制約の名前を指定します。テーブル定義から UNIQUE 制約を削除する場合は、ALTER TABLE コマンドでこの制約の名前が必要になります。

    この文は、前の文と機能的に同等であり、制約に FirstLast という名前を付けます。

    CREATE TABLE Sample.People (
        FirstName VARCHAR(30),
        LastName VARCHAR(30),
        CONSTRAINT FirstLast UNIQUE (FirstName,LastName))

PRIMARY KEY 制約

PRIMARY KEY 制約は、1 つの列または列の組み合わせを主キーとして指定し、列が一意であり、null でないように制約を加えます。主キーの定義はオプションです。テーブルを定義する際、InterSystems IRIS は生成される列 RowID 列 (既定名 "ID") を自動的に作成します。これは一意の行識別子として機能します。主キーの詳細は、"主キーの定義" を参照してください。

  • CREATE TABLE table (column type PRIMARY KEY, ...) は、テーブル内の 1 つの列を主キーとして指定し、その列の値が一意で、null ではないように制約します。

    この文は、EmpNum 列を主キーとして指定するテーブルを作成します。

    CREATE TABLE Sample.Employee (
        EmpNum INT PRIMARY KEY,
        NameLast CHAR (30) NOT NULL,
        NameFirst CHAR (30) NOT NULL,
        StartDate TIMESTAMP,
        Salary MONEY)

    管理ポータルの [カタログの詳細] セクションでは、生成される主キーの名前は tablePKeyN の形式を取ります。ここで、table はテーブルの名前で、N は制約カウント整数です。

  • CREATE TABLE table (..., PRIMARY KEY (column, column2, ...)) は、1 つ以上の列を主キーとして指定します。列のコンマ区切りのリストにおいて、任意の場所で PRIMARY KEY 節を指定できます。この節で単一の列を指定することは、前の構文を使用して特定の列でこの節を指定することと機能的に同等です。この節でコンマ区切りリストの列を指定する場合、各列は NULL ではないと定義されますが、列の値の組み合わせが一意の値である限り、重複する値を含めることができます。

    この文は、FirstName 列と LastName 列の組み合わせを主キーとして指定します。

    CREATE TABLE Sample.People (
        FirstName VARCHAR(30),
        LastName VARCHAR(30),
        PRIMARY KEY (FirstName,LastName))
  • CREATE TABLE table (..., CONSTRAINT pKeyName PRIMARY KEY (column, column2, ...)) では、主キーの名前を明示的に付けることができます。主キーの名前は、管理ポータルの [カタログの詳細] セクションから表示できます。

    この文は、最初の PRIMARY KEY 構文と機能的に同等で、主キーに EmployeePK という名前を付けます。

    CREATE TABLE Sample.Employee (
        EmpNum INT,
        NameLast CHAR (30) NOT NULL,
        NameFirst CHAR (30) NOT NULL,
        StartDate TIMESTAMP,
        Salary MONEY,
        CONSTRAINT EmployeePK PRIMARY KEY (EmpNum))

外部キー制約

FOREIGN KEY 制約は、1 つの列または列の組み合わせを、別のテーブルへの参照として指定します。外部キー列に格納された値は、その他のテーブル内のレコードを一意に識別します。テーブルごとに複数の外部キーを指定できます。各外部キー参照は、参照されるテーブル内に常に存在し、一意として定義される必要があります。参照される列は重複値または NULL を持つことはできません。外部キーの詳細は、"外部キーの定義" を参照してください。

  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (column) REFERENCES refTable (refColumn)) は、refTable 参照テーブルの refColumn 列を参照する外部キーとして作成されたテーブルから、列を指定します。外部キー列および参照される列は異なる名前でもかまいませんが、データ型と列の制約は同じでなければなりません。fKeyName は外部キーの名前を指定し、必須の要素です。

    この文は、CustomersFK という名前の外部キーを定義する Orders テーブルを作成します。この外部キーでは、CustomerNum 列の値は、Customers テーブルの CustID 列で指定された ID になります。

    CREATE TABLE Orders (
        OrderID INT,
        OrderItem VARCHAR,
        OrderQuantity INT,
        CustomerNum INT,
        CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
        CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID))
  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (column, column2, ...) REFERENCES refTable (refColumn, refColumn2, ...)) は、列の組み合わせを、参照される列の外部キーとして指定します。外部キー列および参照される列は、列の数およびリストでの順序が一致している必要があります。

    この文は、OrdersCustomerNum 列と SalesPersonNum 列の組み合わせを外部キーとして指定します。これらの列の値は、Customers テーブルの対応する CustID 列と SalespID 列を参照します。

    CREATE TABLE Orders (
        OrderID INT,
        OrderItem VARCHAR,
        OrderQuantity INT,
        CustomerNum INT,
        SalesPersonNum INT,
        CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
        CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum,SalesPersonNum) REFERENCES Customers (CustID,SalespID))
  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES refTable)) は、参照列の名前を省略します。列または列の組み合わせの外部キーは、既定で参照テーブルの主キーになります (定義されている場合)。そうでない場合は、参照テーブルの IDENTITY 列 (定義されている場合)、あるいは参照テーブルの RowID 列になります。

    この文は、CustomerNum 列が Customers テーブルの主キーを参照する外部キーを設定します。この場合は、このテーブルに主キーが定義済みであることを前提とします。

    CREATE TABLE Orders (
        OrderID INT,
        OrderItem VARCHAR,
        OrderQuantity INT,
        CustomerNum INT,
        SalesPersonNum INT,
        CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
        CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers)
  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... ON UPDATE refAction)) は、参照テーブルに対する UPDATE ルールを定義します。参照テーブルの行の主キーの値を変更しようとする場合は、ON UPDATE 節で、そのテーブルの行に対して実行されるアクションが定義されます。有効な参照アクションの値は、NO ACTION (既定)、SET DEFAULT、SET NULL、および CASCADE です。この節は ON DELETE 節と組み合わせて指定できます。

    この文は、参照列 CustID の更新時に、外部キー列 CustomerNum が同じ更新を受け取るテーブルを作成します。

    CREATE TABLE Orders (
        OrderID INT,
        OrderItem VARCHAR,
        OrderQuantity INT,
        CustomerNum INT,
        CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
        CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID)
            ON UPDATE CASCADE)
  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... ON DELETE refAction)) は、参照テーブルに対する DELETE ルールを定義します。参照テーブルから行を削除しようとする場合は、ON DELETE 節で、そのテーブル内の行に対して実行されるアクションが定義されます。有効な参照アクションの値は、NO ACTION (既定)、SET DEFAULT、SET NULL、および CASCADE です。この節は ON UPDATE 節と組み合わせて指定できます。

    この文は、外部キー列に参照列の値の更新をカスケードするテーブルを作成しますが、参照列の値が削除された場合、対応する外部キーの値は NULL に設定されます。

    CREATE TABLE Orders (
        OrderID INT,
        OrderItem VARCHAR,
        OrderQuantity INT,
        CustomerNum INT,
        CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
        CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID)
            ON UPDATE CASCADE
            ON DELETE SET NULL)
  • CREATE TABLE table (..., CONSTRAINT fKeyName FOREIGN KEY (...) REFERENCES ... NOCHECK)) は、外部キーの参照整合性のチェックを無効にします。つまり、INSERT または UPDATE 処理により、参照テーブル内の行に対応しない値が外部キー列に指定される可能性があります。

    NOCHECK キーワードも、外部キーに対する ON DELETE または ON UPDATE 参照アクションが指定されている場合に、これらのアクションの実行を妨げます。SQL クエリ・プロセッサでは、外部キーを使用してテーブルでの結合を最適化できます。ただし、外部キーが NOCHECK として定義されている場合、SQL クエリ・プロセッサはそれを定義済みと見なしません。NOCHECK 外部キーは、引き続き xDBC カタログ・クエリに対して外部キーとして報告されます。詳細は、"外部キーの使用法" を参照してください。

特殊な列と列のプロパティ

計算列

これらの構文は、ユーザ指定ではなく、INSERT または UPDATE 時に計算される列を定義する方法を示しています。これらの列の詳細は、"INSERT または UPDATE 時の計算フィールドの値" を参照してください。

  • CREATE TABLE table (column type COMPUTECODE [OBJECTSCRIPT | PYTHON] {code}, ...) は、指定された ObjectScript コードまたは Python コードを使用して、INSERT 時に値が計算および格納される列を定義します。OBJECTSCRIPT キーワードも PYTHON キーワードも指定しないと、コードは既定で ObjectScript になります。計算済みの列の値は、UPDATE コマンドやトリガ・コード操作など、それ以降のテーブルの更新によって変更されることはありません。

    以下の文は、行が挿入されると DOB 列で指定された日付に基づいて Age 列を計算するテーブルを作成します。

    CREATE TABLE MyStudents (
       Name VARCHAR(16) NOT NULL,
       DOB DATE,
       Age VARCHAR(12) COMPUTECODE {
            set bdate = $zdate({DOB}, 8)
            set today = $zdate($horolog,8)
            set {Age} = $select(bdate = "":"", 1:(today - bdate) \ 10000)},
       Grade INT)
    CREATE TABLE MyStudents (
       Name VARCHAR(16) NOT NULL,
       DOB DATE,
       Age VARCHAR(12) COMPUTECODE PYTHON {
            import datetime as d
            iris_date_offset = d.date(1840,12,31).toordinal()
            bdate = d.date.fromordinal(cols.getfield('DOB') + iris_date_offset).strftime("%Y%m%d")
            today = d.date.today().strftime("%Y%m%d")
            return str((int(today) - int(bdate)) // 10000) if bdate else ""},
       Grade INT)
    
  • CREATE TABLE table (column type COMPUTECODE ... {code} COMPUTEONCHANGE (column, column2, ...), ...) は、COMPUTEONCHANGE 節で指定されたテーブル列のいずれかが以降のテーブル更新で変更されると、計算済みの列の値を再計算します。再計算された値は、以前に保存された値を置き換えます。COMPUTEONCHANGE で指定された列がテーブル仕様に含まれていない場合は、InterSystems SQL で SQLCODE -31 エラーが生成されます。

    以下の文は、DOB 列が更新されると Age 列を再計算します。Birthday 列には、列が前回変更された時点のタイムスタンプが含まれます。

    CREATE TABLE MyStudents (
        Name VARCHAR(20) NOT NULL,
        DOB TIMESTAMP,
        Birthday VARCHAR(40) COMPUTECODE {
            set {Birthday} = $zdate({DOB})
            _" changed: "_$zdatetime($ztimestamp) }
            COMPUTEONCHANGE (DOB))
    

    COMPUTEONCHANGE は、列定義に対応するクラス・プロパティのために SqlComputeOnChange キーワードを %%UPDATE 値と共に定義します。このプロパティ値は、最初に INSERT 処理の一部として計算され、UPDATE 処理の間に再計算されます。対応する永続クラスの定義の詳細は、"永続クラスの作成によるテーブルの定義" を参照してください。

  • CREATE TABLE table (column type COMPUTECODE ... {code} CALCULATED, ...) は、列の値がデータベースに格納されておらず、列が照会されるたびに生成されるように指定します。計算列によりデータ・ストレージのサイズが縮小しますが、クエリのパフォーマンスが低下する可能性があります。

    この列は、列定義に対応するクラス・プロパティの Calculated ブーリアン・キーワードを定義します。CALCULATED のプロパティには、そのプロパティが SQLComputed でない場合はインデックスを付けることはできません。

    この文は DaysToBirthday 列の値を計算します。この値は現在の日付に応じて変化します。{*} コードは、計算される列を指定する構文で、この場合は DaysToBirthday になります。

    CREATE TABLE MyStudents (
        Name VARCHAR(20) NOT NULL,
        DOB TIMESTAMP,
        DaysToBirthday INT COMPUTECODE {
            set {*} = $zdate({DOB},14) - $zdate($horolog,14) } CALCULATED)
  • CREATE TABLE table (column type COMPUTECODE ... {code} TRANSIENT, ...) は CALCULATED に似ていますが、列がデータベースに保存されないことも指定します。

    この列は、列定義に対応するクラス・プロパティの Transient ブーリアン・キーワードを定義します。TRANSIENT のプロパティにインデックスを付けることはできません。

    CALCULATED および TRANSIENT キーワードは相互に排他的で、同様の動作を提供します。TRANSIENT ではプロパティが保存されません。CALCULATED ではプロパティに対してインスタンス・メモリが割り当てられません。そのため、CALCULATED が指定されるとTRANSIENT が暗黙的に設定されます。

  • CREATE TABLE table (column type ON UPDATE updateSpec, ...) は、updateSpec によって指定される値に基づいて、行がテーブル内で更新される場合は常に再計算される列を定義します。列に COMPUTECODE データ制約も存在する場合、ON UPDATE 節を指定することはできません。

    この文は、LastUpdated 列を含むテーブルを作成します。この列の値は、対応する行が更新される場合に常に現在の時刻に更新されます。テーブルに格納されたタイムスタンプの値は、2 桁の精度を持ちます。

    CREATE TABLE MyStudents (
        Name VARCHAR(20) NOT NULL,
        DOB TIMESTAMP,
        LastUpdated TIMESTAMP DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2))
    
    
  • CREATE TABLE table (column type IDENTITY, ...) は、システムで生成された整数値を持つ RowID 列を、指定された名前の列で置き換えます。

    RowID 列と同様に、この列は一意のシステム生成された整数値を持つ単一の列の IDKEY インデックスとして動作します。ここで、各値は対応するテーブル行の一意のレコード ID として機能します。IDENTITY 列を定義することにより、IDKEY としての主キーの定義が回避されます。テーブルごとに 1 つの IDENTITY 列のみを定義できます。type は整数データ型である必要があります。type を省略すると、データ型は BIGINT として定義されます。IDENTITY 値はユーザ指定にすることができず、UPDATE 文で変更することもできません。

    この値は IdNum 列を IDKEY として設定します。この列は SELECT * などの選択クエリの一部として返されます。

    CREATE TABLE Employee (
        EmpNum INT NOT NULL,
        IdNum IDENTITY NOT NULL,
        Name CHAR(30) NOT NULL,
        CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum))

IDENTITY 列の操作の詳細は、"IDENTITY キーワードを使用した名前付き RowId 列の作成" を参照してください。

カウンタ列

InterSystems SQL は、3 つのタイプのシステム生成の整数カウンタ列を提供します。これらの列は相互排他的ではなく、同じテーブル内で同時に指定できます。3 つの列すべてのデータ型が、%Library.BigIntOpens in a new tab データ型クラスにマッピングしています。

カウンタ・タイプ カウンタの範囲 自動インクリメントの条件 カウントが発生するユーザ指定値 ユーザ指定値 重複値 このタイプの列 カウンタ・リセット条件 シャード・テーブルのサポート
AUTO_INCREMENT テーブル単位 INSERT NULL または 0 可能。システム・カウンタには影響しない。 可能 テーブルごとに 1 つ TRUNCATE TABLE あり
SERIAL シリアル・カウンタ列単位 INSERT NULL または 0 可能。システム・カウンタをインクリメントする場合がある。 可能 テーブルごとに複数 TRUNCATE TABLE なし
ROWVERSION ネームスペース全体 INSERT または UPDATE なし 不可 不可 テーブルごとに 1 つ リセットなし なし

これらのカウンタ列の詳細は、"RowVersion、AutoIncrement、および Serial カウンタ・フィールド" を参照してください。

  • CREATE TABLE table (column type AUTO_INCREMENT, ...) は、テーブルに挿入が行われるたびにインクリメントするカウンタ列を作成します。テーブルごとに 1 つの AUTO_INCREMENT カウンタ列のみを指定できます。明示的な整数データ型の後、AUTO_INCREMENT キーワードを設定する必要があります。例:

    CREATE TABLE MyStudents (
        Name VARCHAR(16) NOT NULL,
        DOB TIMESTAMP,
        AutoInc BIGINT AUTO_INCREMENT)
    

    または、%Library.AutoIncrementOpens in a new tab データ型を使用して AUTO_INCREMENT 列を定義できます。したがって、以下は有効な列定義構文です:MyAutoInc %AutoIncrement, MyAutoInc %AutoIncrement AUTO_INCREMENT

  • CREATE TABLE table (column SERIAL, ...) は、テーブルに対して INSERT 処理が行われるたびにインクリメントするカウンタ列を作成します。SERIAL カウンタ列として複数の列を指定できます。明示的なデータ型の後に SERIAL キーワードを指定します。例:

    CREATE TABLE MyStudents (
       Name VARCHAR(16) NOT NULL,
        DOB TIMESTAMP,
        Counter SERIAL)
  • CREATE TABLE table (column ROWVERSION, ...) は、ネームスペース内のすべてのテーブルで INSERT または UPDATE 処理が行われるたびにインクリメントするカウンタ列を作成します。明示的なデータ型の後に ROWVERSION キーワードを指定します。例:

    CREATE TABLE MyStudents (
        Name VARCHAR(16) NOT NULL,
        DOB TIMESTAMP,
        RowVer ROWVERSION)

%DESCRIPTION キーワード

  • CREATE TABLE table (..., %DESCRIPTION description) は、作成されるテーブルの説明を指定します。説明のテキスト文字列を引用符で囲みます。例:

    CREATE TABLE Employee (
        %Description 'Employees at XYZ Inc.',
        EmpNum INT PRIMARY KEY,
        NameLast VARCHAR(30) NOT NULL,
        NameFirst VARCHAR(30) NOT NULL,
        StartDate TIMESTAMP)
  • CREATE TABLE table (column type %DESCRIPTION description, ...) は、列の説明を指定します。列ごとに 1 つの説明を指定できます。説明のテキスト文字列を引用符で囲みます。例:

    CREATE TABLE Employee (
        EmpNum INT PRIMARY KEY,
        NameLast VARCHAR(30) NOT NULL,
        NameFirst VARCHAR(30) NOT NULL,
        StartDate TIMESTAMP %Description 'Format: MM/DD/YYYY')

%PUBLICROWID キーワード

  • CREATE TABLE table (%PUBLICROWID, ...) は、一意の、システム生成された整数値を持つ RowID 列をパブリックにします。例:

    CREATE TABLE Employee (
        %PUBLICROWID,
        EmpNum INT PRIMARY KEY,
        NameLast VARCHAR(30) NOT NULL,
        NameFirst VARCHAR(30) NOT NULL,
        StartDate TIMESTAMP)

    この列は "ID" と名付けられ、列 1 に割り当てられます。テーブルに対応するクラスは “Not SqlRowIdPrivate” で定義されます。ALTER TABLE を使用して %PUBLICROWID を指定することはできません。

    RowID がパブリックの場合、以下のようになります。

    • RowID 値は SELECT * によって表示されます。

    • RowID は、外部キー参照として使用できます。

    • 主キーが定義されていない場合、RowID は制約名RowIDField_As_PKey暗黙的な主キー制約として扱われます。

    • コピーされる列名を指定しなければ、テーブルを使用してデータを重複テーブルにコピーすることはできません。

    RowID 列の詳細は、"RowID は非表示か" を参照してください。

照合プロパティ

  • CREATE TABLE table (column type COLLATE sqlCollation, ...) は、指定された列で値を並べて比較するために使用される照合タイプを設定します。有効な照合の値は、%EXACT、%MINUS、%PLUS、%SPACE、%SQLSTRING、%SQLUPPER、%TRUNCATE、および %MVR です。

    この文は、UserName 列を大文字と小文字を区別する文字列としてソートし、列内の NULL および数値を文字列の文字として処理します。

    CREATE TABLE Sample.People (
        UserName VARCHAR(30) COLLATE %SQLSTRING,
        FirstName VARCHAR(30),
        LastName VARCHAR(30))

テーブルのオプション

シャード・テーブル

これらの構文はシャード・テーブルを定義するオプションを提供します。このテーブルでは、その列の 1 つをシャード・キーとして使用することで、テーブル行は自動的にデータ・ノード間で水平方向に分割されます。シャード・テーブルにより、特に多数の行がテーブルに格納されている場合に、テーブルに対するクエリのパフォーマンスが向上します。大きなテーブルを結合するクエリで高いパフォーマンスを得るには、各テーブルをコシャードします。コシャードでは、各テーブルからシャード・キー値が同じ行を 1 つのデータ・ノードにまとめることでテーブルの行を分割します。シャードの詳細は、"シャーディングによるデータ量に応じた水平方向の拡張" を参照してください。

Note:

すべての CREATE TABLE 構文でシャード・テーブルがサポートされるわけではありません。詳細は、"シャード・テーブルの制限事項" を参照してください。

  • CREATE TABLE table ... SHARD は、シャード・テーブルを定義し、RowID 列をシャード・キーとして使用します。これは、システム割り当てシャード・キー (SASK) として知られています。テーブルに IDENTITY 列が定義されていて、明示的なシャード・キーがない場合、InterSystems SQL では代わりに IDENTITY 列を SASK として使用します。SASK を使用することは、テーブルをシャーディングするための最も簡単で効果的な方法です。列定義の後に SHARD キーワードを指定します。

    この文は、既定の RowID 列をシャード・キーとして使用するシャード・テーブルを作成します。

    CREATE TABLE Vehicle (
        Make VARCHAR(30) NOT NULL,
        Model VARCHAR(20) NOT NULL,
        Year INT NOT NULL,
        Vin CHAR(17) NOT NULL)
    SHARD
    
  • CREATE TABLE table ... SHARD KEY (shardKeyColumn, shardKeyColumn2, ...) は、1 つの列、または列のコンマ区切りのリストをシャード・キーとして使用するよう指定します。これは、ユーザ定義のシャード・キー (UDSK) として知られています。

    この文は、2 つの列で構成されたシャード・キーを持つテーブルを作成します。

    CREATE TABLE Car (
        Owner VARCHAR(30) NOT NULL,
        Plate VARCHAR(10) NOT NULL,
        State CHAR(2) NOT NULL)
    SHARD KEY (Plate, State)
    
    

    この構文を使用して、定義している 2 つ以上のテーブルをコシャードすることもできます。コシャードしたテーブルの UDSK 列の結合は、UDSK ではない列の結合よりもはるかに効率的に動作します。したがって、頻繁に使用する結合列のセットには UDSK を定義することをお勧めします。

    これらの文は、列 Vin および VehicleNumber にシャード・キーを定義した 2 つのテーブルを作成します。

    CREATE TABLE Vehicle (
        Make VARCHAR(30) NOT NULL,
        Model VARCHAR(20) NOT NULL,
        Year INT NOT NULL
        Vin CHAR(17) NOT NULL)
    SHARD KEY (Vin)
    
    CREATE TABLE Citation (
        CitationID VARCHAR(8) NOT NULL,
        Date TIMESTAMP NOT NULL,
        LicenseNumber VARCHAR(12) NOT NULL
        Plate VARCHAR(10) NOT NULL,
        VehicleNumber CHAR(17) NOT NULL)
    SHARD KEY (VehicleNumber)
    

    このようなテーブルでは、UDSK 列を結合するときのパフォーマンスが向上します。例えば、以下のように車両に関連付けられた交通違反通知を返すクエリが考えられます。

    SELECT * FROM Citation, Vehicle WHERE Citation.VehicleNumber = Vehicle.Vin

    シャード・キーの選択の詳細は、"シャード・キーの選択" を参照してください。

  • CREATE TABLE table ... SHARD KEY (coshardKeyColumn) COSHARD WITH (coshardTable) はテーブルを作成し、その整数値列の 1 つをシャード・キー coshardKeyColumn として設定します。結合のこのシャード・キーを、別のシャード済みテーブル coshardTable で使用できます。このテーブルには、SHARD 構文を使用してシステム割り当てシャード・キー (SASK) を定義する必要があります。必要に応じて、coshardKeyColumncoshardTable の SASK 列への外部参照として定義することもできます。外部キー参照を使用して参照整合性を適用できます。同時に、シャード・キーを利用することにより、他のテーブルの SASK 列とのマッチングによるそのテーブルとの結合で優れたパフォーマンスが得られます。

    以下の文は、CustomerID 列をシャード・キーとして定義したテーブルを作成します。このキーは、既存のシャード済みテーブルである Customer のシャード・キーを使用したコシャード結合に使用します。

    CREATE TABLE Order (
        Date TIMESTAMP NOT NULL,
        Amount DECIMAL(10,2) NOT NULL, 
        CustomerID CUSTOMER NOT NULL)
    SHARD KEY (CustomerID) COSHARD WITH Customer
    

一時テーブル

  • CREATE GLOBAL TEMPORARY TABLE table ... は、テーブルをグローバル一時テーブルとして作成します。ここで、テーブル定義はすべてのプロセスで利用可能ですが、テーブル・データ (ストリーム・データを含む) およびインデックスは、テーブルを作成したプロセスの間のみ維持されます。このデータはプロセス・プライベート・グローバルに格納され、プロセスの終了時に削除されます。

    この文は、以下のように一時テーブルを作成します。

    CREATE GLOBAL TEMPORARY TABLE TempEmp (
        EmpNum INT NOT NULL,
        NameLast CHAR(30) NOT NULL,
        NameFirst CHAR(30) NOT NULL,
        CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum))
    

    一時テーブルを作成するプロセスに関係なく、一時テーブルの所有者は自動的に _PUBLIC に設定されています。つまり、キャッシュされた一時テーブル定義にはすべてのユーザがアクセスできます。例えば、あるストアド・プロシージャによって一時テーブルが作成された場合、そのストアド・プロシージャを呼び出す許可が与えられているユーザであれば、誰でもこの一時テーブルにアクセスできます。これは一時テーブル定義にのみ適用されます。一時テーブル・データは呼び出しに固有のものです。したがって、一時テーブル・データにアクセスできるのは、現在のユーザ・プロセスのみです。

    グローバル一時テーブルのテーブル定義は、ベース・テーブルと同じです。グローバル一時テーブルには一意の名前を付ける必要があります。既存のベース・テーブルと同じ名前を付けようとすると、SQLCODE -201 エラーが返されます。このテーブルは、明示的に削除 (DROP TABLE を使用) されるまで残り続けます。ALTER TABLE を使用してテーブル定義を変更できます。

    対応するクラス定義には、追加のクラス・パラメータ SQLTABLETYPE="GLOBAL TEMPORARY" が含まれます。InterSystems IRIS の標準的なテーブルと同様、ClassType=persistent ですが、このクラスには Final キーワードが含まれているため、このクラスにサブクラスを作成することはできません。

テーブル・ストレージ

  • CREATE TABLE table ... WITH STORAGETYPE = [ROW | COLUMNAR] は、基盤となるデータをテーブルに格納するために使用するレイアウトを指定します。

    • ROW を指定すると、データが行単位で格納されます。行ストレージを使用すると効率的なトランザクションが実現します。例えば、オンライン・トランザクション処理 (OLTP) のワークフローで頻繁に行を更新または挿入する場合です。WITH STORAGETYPE 節を省略すると、作成したテーブルは既定で行ストレージになります。

    • COLUMNAR を指定すると、データが列単位で格納されます。列指向ストレージを使用すると効率的なクエリが実現します。例えば、オンライン分析処理 (OLAP) のワークフローで特定列のデータをフィルタ処理する場合や集計する場合です。列指向ストレージは、2022.2 での試験的機能です。InterSystems IRIS の以前のバージョンでは、すべてのテーブル・データが行単位で格納されます。

      Note:

      照合タイプを明示的に指定しない限り、パフォーマンス上の理由から、列指向ストレージのレイアウトでは既定で EXACT 照合が使用されます。行ストレージのレイアウトでは、ネームスペースの既定である SQLUPPER 照合が使用されます。

    ストレージ・レイアウト選択の詳細は、"SQL テーブルのストレージ・レイアウトの選択" を参照してください。

    以下の文は、列指向ストレージ・レイアウトによるテーブルを作成します。

    CREATE TABLE Sample.TransactionHistory (
      AccountNumber INTEGER,
      TransactionDate DATE,
      Description VARCHAR(100),
      Amount NUMERIC(10,2),
      Type VARCHAR(10))
    WITH STORAGETYPE = COLUMNAR
    

    以下の文は、CREATE TABLE AS SELECT 節を使用することで、列指向ストレージによるテーブルを作成します。

    CREATE TABLE Sample.TransactionHistory AS
      SELECT AccountNumber, TransactionDate, Description, Amount, Type
      FROM Sample.BankTransaction
    WITH STORAGETYPE = COLUMNAR
    
    Tip:

    CREATE TABLE AS SELECT を使用すれば、それぞれ別々のストレージ・タイプによる複数のテーブルを作成し、そのパフォーマンスを比較して実験できます。

  • CREATE TABLE table (column type ... WITH STORAGETYPE = [ROW | COLUMNAR], ...) は、列単位で行ストレージまたは列指向ストレージを指定します。他のすべての列には、既定の行ストレージが設定されるか、テーブル定義の最後に WITH STORAGETYPE 節で指定したストレージ・タイプが設定されます。

    以下の文は、Amount 列のみを列指向ストレージ・レイアウトとしたテーブルを作成します。この文では、テーブル定義の最後に WITH STORAGETYPE 節がないので、残りの列は既定の行ストレージ・レイアウトになります。

    CREATE TABLE Sample.BankTransaction (
      AccountNumber INTEGER,
      TransactionDate DATE,
      Description VARCHAR(100),
      Amount NUMERIC(10,2) WITH STORAGETYPE = COLUMNAR,
      Type VARCHAR(10))
    
    

クラス・パラメータ

  • CREATE TABLE table ... WITH %CLASSPARAMETER pName = pValue, %CLASSPARAMETER pName2 = pValue2, ... は、作成されるテーブルの主要な側面を定義する、1 つ以上の名前と値の組み合わせである %CLASSPARAMETER を指定します。各パラメータ名 pName は、指定された値である pValue に設定されます。

    この文では、USEEXTENTSET クラス・パラメータは、^EPgS.D8T6.1 のような生成されるグローバル名の使用を無効にします。このようなグローバルは、データに対する IDKEY インデックスとして使用されます。DEFAULTGLOBAL クラス・パラメータは、^GL.EMPLOYEE をインデックスの明示的なグローバル名として指定します。

    CREATE TABLE Employees (
        EmpNum INT NOT NULL,
        NameLast CHAR(30) NOT NULL,
        NameFirst CHAR(30) NOT NULL,
        CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum)
        )
    WITH %CLASSPARAMETER USEEXTENTSET = 0,
         %CLASSPARAMETER DEFAULTGLOBAL = '^GL.EMPLOYEE'
    

    DEFAULTGLOBAL を使用して、拡張グローバル参照を指定できます。これは、完全参照 (%CLASSPARAMETER DEFAULTGLOBAL = '^|"USER"|GL.EMPLOYEE') にすることも、ネームスペース部分のみ (%CLASSPARAMETER DEFAULTGLOBAL = '^|"USER"|') にすることもできます。

引数

table

CREATE TABLE コマンドで、作成するテーブルの名前を有効な 識別子として指定します。テーブル名は修飾、未修飾のどちらでもかまいません。

  • 未修飾のテーブル名には、tablename という構文を使用します。schema (およびピリオド (.) 文字) は省略します。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。初期のシステム全体の既定のスキーマ名は、既定のクラス・パッケージ名 User に対応する SQLUser です。スキーマ検索パスの値は無視されます。

    システム全体の既定のスキーマ名は構成可能です

    現在のシステム全体の既定のスキーマ名を確認するには、$SYSTEM.SQL.Schema.Default()Opens in a new tab メソッドを使用します。

  • テーブル名を修飾する場合は、schema.tablename という構文を使用します。既存のスキーマ名を指定することも、新規スキーマ名を指定することもできます。既存のスキーマ名を指定すると、テーブルはスキーマ内に配置されます。新規スキーマ名を指定すると、その名前のスキーマ (および関連するクラス・パッケージ) が作成され、テーブルがそのスキーマ内に配置されます。

テーブル名とスキーマ名の名前付け規約

テーブル名とスキーマ名は、SQL 識別子の名前付け規約と、非英数文字の使用、一意性、および最大長に関する追加の制約に従います。% 文字で始まる名前は、システムによる使用のために予約されています。既定では、スキーマ名とテーブル名は単純な識別子であり、大文字と小文字が区別されません。

InterSystems IRIS はテーブル名を使用して、対応するクラス名を生成します。クラス名には英数字 (文字および数字) のみを使用し、最初の 96 文字は一意である必要があります。クラス名を生成するために、InterSystems IRIS はまず記号 (非英数字) 文字をテーブル名から削除し、一意性と最大長の制約を課して一意のクラス名を生成します。

InterSystems IRIS はスキーマ名を使用して、対応するクラス・パッケージ名を生成します。パッケージ名を生成するために、InterSystems IRIS はまずスキーマ名内の記号 (非英数字) 文字に対して削除または特殊処理のいずれかを実行します。次に InterSystems IRIS は、一意性と最大長の制約を課して一意のパッケージ名を生成します。スキーマ名では大文字と小文字が区別されませんが、対応するクラス・パッケージ名では大文字と小文字が区別されます。指定したスキーマ名が、既存のクラス・パッケージ名と大文字/小文字のみが異なり、パッケージ定義が空の (クラス定義が含まれていない) 場合、InterSystems IRIS では、クラス・パッケージ名の大文字/小文字を変更して 2 つの名前が照合されます。

スキーマとテーブルに同じ名前を使用することはできますが、同じスキーマ内でテーブルとビューに同じ名前を使用することはできません。スキーマ名とテーブル名からパッケージ名とクラス名を生成する方法の詳細は、"テーブル名とスキーマ名" を参照してください。

テーブル名の文字の制限

InterSystems IRIS は 16 ビット (ワイド) 文字のテーブル名と列名をサポートします。大部分のロケールで、テーブル名にはアクセント記号付き文字を使用でき、生成されるクラス名にもアクセント記号が含まれます。

Note:

日本のロケールでは、アクセント記号付きの文字を識別子でサポートしていません。日本語の識別子には、日本語の文字に加え、ラテン文字の A ~ Z と a ~ z (65 ~ 90 および 97 ~ 122)、アンダースコア文字 (95)、とギリシャ文字の大文字 (913 ~ 929 および 931 ~ 937) を使用できます。nls.Language テストでは、= ではなく [ (包括関係演算子) を使用しています。オペレーティング・システム・プラットフォームごとに日本語ロケールが異なるためです。

既存のテーブルのチェック

テーブルが現在のネームスペースに既に存在するかどうかを確認するには、$SYSTEM.SQL.Schema.TableExists("schema.tname")Opens in a new tab を使用します。

既定では、既存のテーブルと同じ名前のインテーブルを作成しようとすると、InterSystems IRIS はテーブルの作成試行を拒否し、SQLCODE -201 エラーを発行します。現在のシステム全体の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[既存テーブルに対して DDL CREATE TABLE または CREATE VIEW を許可] 設定が表示されます。既定値は 0 で、これが推奨設定です。このオプションを 1 に設定すると、InterSystems IRIS はこのテーブルに対応するクラス定義を削除し、クラスを再作成します。これは、DROP TABLE を実行して既存のテーブルを削除し、CREATE TABLE を実行する動作に似ています。この場合、$SYSTEM.SQL.CurrentSettings()Opens in a new tab[DDL DROP TABLEがテーブルのデータを削除する] の値を 1 (既定) に設定することを強くお勧めします。詳細は、"DROP TABLE" を参照してください。

管理ポータル、[システム管理][構成][SQL とオブジェクトの設定][SQL] から [冗長な DDL ステートメントを無視] チェック・ボックスにチェックを付けることにより、このオプション (および他の同様の作成、変更、および削除のオプション) をシステム全体で設定できます。これらの設定の詳細は、SQL 構成パラメータに関するページを参照してください。

上記の設定よりも、述語 IF NOT EXISTS の動作が優先されます。これらの設定によって実質的にテーブルが上書きされ、SQLCODE 0 が返されます。IF NOT EXISTS を指定すると、このコマンドでは何も実行されず、メッセージと共に SQLCODE 1 が返されます。

column

CREATE TABLE コマンドで、作成中のテーブルの列を定義するために使用する 1 つの列名または列名のコンマ区切りのリストを指定します。列名は任意の順序で指定でき、スペースを使用して列名を関連付けられたデータから分離します。例: CREATE TABLE myTable (column1 INT, column2 VARCHAR(10)).規則によって、各列の定義は通常、別の行にインデントされて表示されます。これは必須ではありませんがお勧めします。列名は、一意の主キーおよび外部キーの制約を定義するためにも使用できます。

列名のリストを括弧で囲みます。

1 つの列を定義する代わりに、複数の列 (プロパティ) を定義する既存の埋め込みシリアル・オブジェクトを列定義で参照することもできます。列名に続けて、シリアル・オブジェクトのパッケージ名とクラス名を指定します。例えば、Office Sample.Address のように指定します。データ型やデータ制約は指定しないでください。ただし、%DESCRIPTION を指定することはできます。CREATE TABLE を使用して、埋め込みシリアル・オブジェクトを作成することはできません。

列名の名前付け規約

列名は、識別子の規約に従い、テーブル名と同様の名前付け制約を受けます。列名の先頭文字に % は使用しないでください。列 %z または %Z で始まる列名は許容されます。列名は 128 文字を超えることはできません。既定の列名は、簡単な識別子です。大文字と小文字は区別されません。同一テーブル内の別の列と大文字/小文字区別のみが異なる列名を作成しようとすると、SQLCODE -306 エラーが生成されます。

InterSystems IRIS は列名を使用して、対応するクラス・プロパティ名を生成します。プロパティ名には英数字 (文字および数字) のみを使用し、その長さは最大 96 文字です。InterSystems IRIS は、このプロパティ名を生成するために、最初に列名から句読点を削除し、次に 96 文字以内の一意の識別子を生成します。InterSystems IRIS は、一意のプロパティ名を作成するために、必要に応じて列名の最後の文字を、0 で始まる整数に置き換えます。

この例は、InterSystems IRIS が句読点のみ異なる列名を処理する方法を示します。これらの列に対応するクラス・プロパティには、PatNumPatNu0、および PatNu1 という名前が付けられています。

CREATE TABLE MyPatients (
    _PatNum VARCHAR(16),
    %Pat@Num INTEGER,
    Pat_Num VARCHAR(30),
    CONSTRAINT Patient_PK PRIMARY KEY (_PatNum))

CREATE TABLE で指定された列名は、クラス・プロパティで SqlFieldName キーワード値として表示されます。

動的な SELECT 操作では、一般的な大文字/小文字による変形を促すためにプロパティ名のエイリアスが生成されることがあります。例えば、列名 Home_Street の場合、プロパティ名のエイリアスとして home_streetHOME_STREET、および HomeStreet が割り当てられる可能性があります。その名前が別のフィールド名、または別のフィールド名に割り当てられているエイリアスと競合する場合、エイリアスは割り当てられません。

type

column によって指定される列名のデータ型クラス。指定されたデータ型により、列で使用できるデータ値がそのデータ型に適した値に制限されます。InterSystems SQL は、多くの標準 SQL データ型をサポートしています。

InterSystems SQL データ型 (例えば、VARCHAR(24) や CHARACTER VARYING(24)) またはデータ型のマッピング先のクラス (例えば、%Library.String(MAXLEN=24) または %String(MAXLEN=24)) のどちらかを指定できます。

追加のデータ定義パラメータを定義する場合に、データ型クラスを指定できます。例えば、許可されるデータ値の列挙リスト許可されるデータ値のパターン・マッチング、数値の最大値と最小値、最大長 (MAXLEN) を超えるデータ値の自動切り捨てなどです。

Note:

データ型クラス・パラメータの既定値は、InterSystems SQL データ型の既定値とは異なる場合があります。例えば、VARCHAR() および CHARACTER VARYING() は既定で MAXLEN=1 ですが、対応するデータ型クラス %Library.String は既定で MAXLEN=50 です。

InterSystems IRIS は SQL.SystemDataTypes マッピング・テーブルおよび SQL.UserDataTypes マッピング・テーブルによって、これらの標準 SQL データ型を InterSystems IRIS データ型にマップします。

現在のデータ型のマッピングを表示および変更するには、管理ポータルに進み、[システム管理][構成][SQL とオブジェクトの設定][システム DDL マッピング] の順に選択します。データ型マッピングをさらに作成するには、管理ポータルに進み、[システム管理][構成][SQL とオブジェクトの設定][ユーザー DDL マッピング] の順に選択します。

InterSystems IRIS に対応するデータ型がない SQL のデータ型を指定する場合、その SQL データ型の名前が、対応するクラス・プロパティのデータ型として使用されます。DDL の実行 (SQLExecute) 前に、このユーザ定義の InterSystems IRIS データ型を作成する必要があります。

また、データ型のマッピングは、1 つのパラメータ値を上書きできます。例えば、VARCHAR(100) を、与えられた %String(MAXLEN=100) 標準マッピングにマップしたくないとします。この場合、テーブルに VARCHAR(100) の DDL データ型を追加して、これを上書きし、対応する InterSystems IRIS のタイプを指定します。以下はその例です。

VARCHAR(100) maps to MyString100(MAXLEN=100)

データ・サイズ

データ型の後に続けて、許容データ・サイズを括弧で囲んで指定できます。データ型の名前とデータ・サイズの括弧の間には空白を挿入してもしなくてもかまいません。

文字列の場合、データ・サイズは最大の文字数を表します。例えば以下のようになります。

ProductName VARCHAR (64)

小数が許可される数値のデータ・サイズは、(p,s) のように整数のペアとして表します。1 つ目の整数 p は、データ型の精度です。この数字は数値精度、つまり数値の桁数とは異なります。これは、基盤となる InterSystems IRIS データ型クラスは精度を持たないためです。代わりに、これらのクラスはこの数字を MAXVAL 値および MINVAL 値を計算するために使用します。2 つ目の整数 s は、小数部の最大桁数を指定するスケールです。例:

UnitPrice NUMERIC(6,2)  /* maximum value 9999.99 */

精度と位取りの仕組みの詳細は、"データ型" を参照してください。

query

CREATE TABLE AS SELECT 構文を使用して作成されたテーブルに列定義と列データを提供する SELECT クエリ。このクエリは、テーブル、ビュー、または複数の結合テーブルを指定できます。ただし、通常の SELECT クエリのような ? パラメータは指定できません。

CREATE TABLE AS SELECT クエリのデータ定義は以下のとおりです。

  • CREATE TABLE AS SELECT は、query テーブルから列定義をコピーします。コピーした列の名前を変更するには、query列エイリアスを指定します。

    query で結合テーブルを指定する場合、CREATE TABLE AS SELECT は複数のテーブルから列定義をコピーできます。

  • CREATE TABLE AS SELECT は、常に RowID を非公開として定義します。

    • ソース・テーブルに非公開の RowID がある場合、CREATE TABLE AS SELECT はソース・テーブルの RowID をコピーしませんが、作成したテーブルに新しい RowID 列を作成します。コピーされた行には、新しい一連の RowID 値が割り当てられます。

    • ソース・テーブルに公開された (非表示ではない) RowID がある場合、またはクエリで明示的に非公開の RowID を選択している場合、CREATE TABLE AS SELECT はこのテーブルに新しい RowID 列を作成します。ソース・テーブルの RowID は、非公開でも、一意でも、必須でもない通常の BigInt 列として新しいテーブルにコピーされます。ソース・テーブルの RowID を "ID" と名付けた場合、新しいテーブルの RowID の名前は "ID1" となります。

  • ソース・テーブルに IDENTITY 列がある場合、CREATE TABLE AS SELECT はこの列とその現在のデータを、ゼロでない正の整数の、一意でも必須でもない通常の BIGINT 列としてコピーします。

  • CREATE TABLE AS SELECT は、IDKEY インデックスを定義します。これはコピーされた列定義に関連付けられたインデックスをコピーしません。

  • CREATE TABLE AS SELECT は、列の制約をコピーしません。これはコピーされた列定義に関連付けられた NULL/NOT NULL、UNIQUE、主キー、または外部キーの制約をコピーしません。

  • CREATE TABLE AS SELECT は、既定の制約またはコピーされた列定義に関連付けられた値をコピーしません。

  • CREATE TABLE AS SELECT は、コピーされた列定義に関連付けられた COMPUTECODE データ制約をコピーしません。

  • CREATE TABLE AS SELECT は、コピーされたテーブルまたは列定義に関連付けられた %DESCRIPTION 文字列をコピーしません。

defaultSpec

列の既定値は、リテラル値またはキーワード・オプションとして DEFAULT 節で指定できます。リテラル既定値として指定する文字列は一重引用符で囲む必要があります。数値既定値には一重引用符は必要ありません。例えば以下のようになります。

CREATE TABLE membertest (
    MemberId INT NOT NULL,
    Membership_status CHAR(13) DEFAULT 'M',
    Membership_term INT DEFAULT 2)

DEFAULT 値はテーブル作成時に検証されません。DEFAULT 値を定義すると、その値ではデータ型、データ長、およびデータ制約の制限を無視できます。ただし、INSERT を使用してテーブルにデータを提供する際には、DEFAULT 値は制限されます。DEFAULT 値はデータ型とデータ長の制限は受けませんが、データ制約の制限は受けます。例えば、Ordernum INT UNIQUE DEFAULT 'No Number' で定義された列の場合、最初は INT データ型の制限を無視して既定値を取ることができます。しかし、2 回目は列の UNIQUE データ制約に違反するため既定値を取ることができません。

DEFAULT が指定されていなければ、暗黙の既定は NULL になります。列に NOT NULL データ制約があれば、この列には明示的に、または DEFAULT で値を指定する必要があります。NOT NULL の既定値として長さゼロの SQL 文字列 (空文字列) は使用しないでください。NULL 値と空文字列の詳細は、"NULL" を参照してください。

DEFAULT データ制約は、NULL、USER、CURRENT_USER、SESSION_USER、SYSTEM_USER、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、SYSDATE、OBJECTSCRIPT などのキーワード・オプションを受け入れます。

USER、CURRENT_USER、および SESSION_USER の DEFAULT キーワードは、列値を ObjectScript の $USERNAME 特殊変数に設定します。

CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPGETDATEGETUTCDATE、および SYSDATE SQL 関数も、DEFAULT 値として使用できます。これらについては、それぞれのリファレンス・ページで説明しています。DEFAULT 値として使用する場合、CURRENT_TIME またはタイムスタンプ関数は、有効桁数の値を付けても付けなくても指定できます。有効桁数を指定しない場合、InterSystems SQL では SQL 構成設定 [GETDATE(), CURRENT_TIME, CURRENT_TIMESTAMP のデフォルトの時刻精度] の有効桁数が使用されます。既定値は 0 です。DEFAULT 関数では、CREATE TABLE 文の実行時ではなく、文が準備/コンパイルされるときに有効になっている時刻精度設定が使用されます。

CURRENT_TIMESTAMP は、データ型 %Library.PosixTimeOpens in a new tab または %Library.TimeStampOpens in a new tab の列の既定値として指定できます。現在の日付と時刻は、列のデータ型によって指定された形式で格納されます。CURRENT_TIMESTAMPGETDATEGETUTCDATE、および SYSDATE は、%Library.TimeStampOpens in a new tab 列 (データ型 TIMESTAMP または DATETIME) の既定値として指定できます。InterSystems IRIS は、データ型に合った形式にデータ値を変換します。

CREATE TABLE mytest (
    TestId INT NOT NULL,
    CREATE_TIMESTAMP DATE DEFAULT CURRENT_TIMESTAMP(2),
    WORK_START TIMESTAMP DEFAULT SYSDATE)

データ型 DATE には TO_DATE 関数を DEFAULT データ制約として使用できます。データ型 TIMESTAMP には TO_TIMESTAMP 関数を DEFAULT データ制約として使用できます。

また、OBJECTSCRIPT literal キーワード句を使用すると、以下の例に示すように、ObjectScript コードを含む引用符付き文字列を指定することで既定値を生成できます。

CREATE TABLE mytest (
    TestId INT NOT NULL,
    CREATE_DATE DATE DEFAULT OBJECTSCRIPT '+$HOROLOG' NOT NULL,
    LOGNUM NUMBER(12,0) DEFAULT OBJECTSCRIPT '$INCREMENT(^LogNumber)')

詳細は、"ObjectScript リファレンス" を参照してください。

uniqueName

有効な識別子として指定された、CONSTRAINT UNIQUE 節でリストされた制約名です。区切り識別子として指定されている場合、制約名に "."、"^"、","、および "->" 文字を含めることができます。制約名はその制約を一意に識別し対応するインデックス名を生成する際にも使用されます。この制約名は、ALTER TABLE コマンドを使用してテーブル定義から制約を削除する際に必要になります。CONSTRAINT UNIQUE にリストされている列を ALTER TABLE で削除することはできないことに注意してください。これを実行しようとすると、SQLCODE -322 エラーが生成されます。

CONSTRAINT UNIQUE 節には以下の構文があります。

CONSTRAINT uniqueName UNIQUE (column1,column2)

この制約は列値 column1 および column2 の組み合わせが必ず一意でなければならないことを示します。これらの個々の列の値自体は一意でなくてもかまいません。この制約に対して、1 つ以上の列を指定できます。

この制約で指定する列はすべて、列定義で定義する必要があります。列定義で定義されていない列を指定すると、SQLCODE -86 エラーが生成されます。指定する列には NOT NULL を定義する必要があります。指定する列にはいずれも UNIQUE を定義しないでください。そのように定義すると、この制約を指定しても意味がありません。

列は任意の順序で指定できます。この列の順序によって、対応するインデックス定義の列の順序が決まります。重複する列名は許可されます。複数列での UNIQUE 制約に単一の列名を指定することができますが、これはその列に UNIQUE データ制約を指定するのと機能的には同じです。将来的に使用できるように、個々の単一列の制約が 1 つの制約名を指定します。

複数列での一意制約の複数の文を 1 つのテーブル定義で指定することができます。制約文は列定義の任意の場所で指定できます。慣例により、通常は定義される列のリストの最後に配置します。

UNIQUE 制約と共に定義されているテーブルの列をリストする方法は、"[カタログの詳細] の [制約] オプション" を参照してください。

pKeyName

有効な識別子として指定された、PRIMARY KEY 制約節で定義された主キー名です。区切り識別子として指定されている場合、制約名に "."、"^"、","、および "->" 文字を含めることができます。ALTER TABLE ではこのオプションの制約名を使用して、定義されている制約を識別します。

テーブルの主キーの定義の詳細は、"主キーの定義" を参照してください。

fKeyName

有効な識別子として指定された、FOREIGN KEY 制約節で定義された外部キー名です。区切り識別子として指定されている場合、制約名に "."、"^"、","、および "->" 文字を含めることができます。ALTER TABLE ではこのオプションの制約名を使用して、定義されている制約を識別します。

テーブルの外部キーの定義の詳細は、"外部キーの定義" を参照してください。

refTable

有効な識別子として指定された、FOREIGN KEY 節で参照するテーブル名です。テーブル名は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。

refColumn

外部キー制約で指定した参照テーブルで定義されている列名またはコンマで区切られた既存の列名のリスト。参照される列を括弧で囲みます。refColumn を省略すると、"外部キーの定義" で説明しているように、.CREATE TABLE は既定の参照列を割り当てます。

参照列として明示的な RowID を指定するには、refColumn%ID として指定してください。例えば、FOREIGN KEY (CustomerNum) REFERENCES Customers (%ID) のようになります。この値は、参照テーブルに主キーまたは外部キーが指定されていない限り、省略された列名と同義です。テーブルのクラス定義に SqlRowIdName が含まれる場合、この値を明示的な RowID として指定できます。

refAction

テーブルに外部キーが含まれる場合は、1 つのテーブルでの変更が他のテーブルにも影響します。外部キーを定義するときにデータの整合性を維持するには、外部キーの元となっているレコードを変更したときに外部キー値に与える影響も定義します。CREATE TABLE で、ON DELETE refAction および ON UPDATE refAction 節は、refColumn で指定された外部キー列が変更されたときに実行されるアクションを指定します。

  • ON DELETE 節は、参照テーブルに対する DELETE ルールを定義します。参照テーブルの行を削除しようとした場合に、ON DELETE 節は参照テーブル内の行に対して実行されるアクションを定義します。

  • ON UPDATE 節は、参照テーブルに対する UPDATE ルールを定義します。参照テーブルの行の主キーの値を変更 (更新) しようとした場合に、ON UPDATE 節は参照テーブル内の行に対して実行されるアクションを定義します。

InterSystems SQL は以下の外部キー参照アクションをサポートします。

参照アクション 説明

NO ACTION (既定)

外部キー列内のいずれかの行が、削除または更新対象の行を参照している場合、削除または更新は失敗します。この制約は、外部キーが自身を参照している場合、適用されません。

SET DEFAULT

削除または更新対象の行を参照している外部キー列を、既定値に設定します。外部キー列が既定値を持たない場合は、NULL に設定されます。行は参照されるテーブル内に存在しなければなりません。また、参照されるテーブルには、既定値に対するエントリが含まれます。

SET NULL

削除または更新対象の行を参照している外部キー列を、NULL に設定します。外部キー列は、NULL 値を許可します。

CASCADE

ON DELETE — 削除対象の行を参照する外部キー列の行も削除します。

ON UPDATE — 更新対象の行を参照する外部キー列の行も更新します。

同じ列の組み合わせを参照して相反する参照アクションを実行する、名前が異なる 2 つの外部キーを定義しないでください。そのような 2 つの外部キーを定義した場合 (例: ON DELETE CASCADE と ON DELETE SET NULL)、InterSystems SQL は ANSI 標準に従い、エラーを生成しません。この代わりに InterSystems SQL では、DELETE 処理または UPDATE 処理でこのような相反する外部キー定義に遭遇したときにエラーを生成します。詳細は、"外部キーの使用法" を参照してください。

code

列の既定値を計算するために COMPUTECODE データ制約で使用されるコード行です。コードを中括弧で囲んで指定します。空白および改行は中括弧の前後で使用できます。

コードのプログラミング言語は、COMPUTECODE 節で設定した値に応じて異なります。

  • COMPUTECODE または COMPUTECODE OBJECTSCRIPT — code を ObjectScript コードで指定します。コードでは、中括弧で囲んで SQL 列名を参照できます (例: {DOB})。ObjectScript コードでは埋め込み SQL を使用できます。投影されたクラスでは、COMPUTECODE に列名 SqlComputeCode とその列の値の計算を指定します。

  • COMPUTECODE PYTHON — code を Python コードで指定します。コードでは、cols.getfield メソッドを使用して SQL 列名を参照できます (例: cols.getfield('DOB'))。投影されたクラスでは、COMPUTECODE に PropertyComputation クラス・メソッドを指定します。このメソッドに、列の値を計算するコードを収めます。Property は計算する列の名前です。投影されたクラスでは、このクラス・メソッドが SqlComputeCode プロパティ・キーワードの代わりに使用されます。

COMPUTECODE または SqlComputeCode プロパティ・キーワードに計算済みフィールドの名前を指定する場合は、SQL フィールド名を指定する必要があります。生成済みテーブルの対応するプロパティ名ではありません。

COMPUTECODE によって提供される既定データ値は、論理 (内部保存) モードである必要があります。計算コード内の埋め込み SQL は、自動的にコンパイルされ、論理モードで実行されます。

以下の例では、Birthday COMPUTECODE 列を定義します。この定義は、ObjectScript コードを使用して DOB 列値から既定値を計算します。

CREATE TABLE MyStudents (
    Name VARCHAR(16) NOT NULL,
    DOB TIMESTAMP,
    Birthday VARCHAR(12) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")},
    Grade INT)

COMPUTECODE には、擬似フィールド参照変数 %%CLASSNAME、%%CLASSNAMEQ、%%OPERATION、%%TABLENAME、%%ID を指定できます。これらの変数は、クラスのコンパイル時に特定の値に変換されます。変数の大文字と小文字は区別されません。

  • ObjectScript の計算コードでは、擬似フィールド参照変数を中括弧で囲んで呼び出します。例: {%%CLASSNAME}

  • Python の計算コードでは、cols.getfield メソッドを使用して擬似フィールド参照変数を呼び出します。例: cols.getfield(%%CLASSNAME)

COMPUTECODE 値は既定値です。列に値を指定しない場合にのみ返されます。COMPUTECODE 値はデータ型の制限を受けません。COMPUTECODE 値は UNIQUE データ制約などのデータ制約の制限を受けます。DEFAULT および COMPUTECODE の両方を指定した場合は、必ず DEFAULT が取られます。

COMPUTECODE ではオプションで COMPUTEONCHANGE、CALCULATED、または TRANSIENT キーワードを取ることができます。

ObjectScript の COMPUTECODE コードにエラーがある場合は、そのコードが初めて実行されるときまで、SQL ではこのエラーは検出されません。そのため、挿入時に値が初めて計算される場合は、INSERT 操作は SQLCODE -415 エラーで失敗します。更新時に値が初めて計算される場合は、UPDATE 操作は SQLCODE -415 エラーで失敗します。クエリ時に値が初めて計算される場合は、SELECT 操作は SQLCODE -350 エラーで失敗します。

COMPUTECODE 保存値にインデックスを付けることができます。アプリケーション開発者は、特に計算列のインデックスを定義する (またはしようとしている) 場合、そのデータ型に基づいて、計算列の保存値が検証され、正規化されている (キャノニック形式の数値) ことを確認する必要があります。

updateSpec

ON UPDATE 節を使用してテーブルを作成し、列を指定すると、その列はテーブルで行が更新されるたびに計算されます。この機能が最もよく使用されるのは、前回行が更新されたときのタイムスタンプ値を含むテーブルで列を定義する場合です。

利用可能な updateSpec オプションは以下のとおりです。

CURRENT_DATE | CURRENT_TIME[(precision)] | CURRENT_TIMESTAMP[(precision)] | GETDATE([prec]) | GETUTCDATE([prec]) | SYSDATE |  USER | CURRENT_USER | SESSION_USER | SYSTEM_USER |  NULL | <literal> | -<number> 

以下の例は、行の挿入時、および行の更新のたびに、RowTS 列を現在のタイムスタンプ値に設定します。

CREATE TABLE mytest (
    Name VARCHAR(48),
    RowTS TIMESTAMP DEFAULT Current_Timestamp(6) ON UPDATE Current_Timestamp(6) )

この例で、DEFAULT キーワードは、INSERT 時に RowTS 列に明示的な値が指定されていない場合、この RowTS に現在のタイムスタンプを設定します。UPDATE が RowTS 列に明示的な値を指定した場合、ON UPDATE キーワードは指定された値を検証しますが、これを無視し、RowTS を現在のタイムスタンプで更新します。指定された値が検証に失敗した場合、SQLCODE -105 エラーが生成されます。

以下の例では、HasBeenUpdated 列をブーリアン値に設定します。

CREATE TABLE mytest (
    Name VARCHAR(48),
    HasBeenUpdated TINYINT DEFAULT 0 ON UPDATE 1 )

以下の例では、WhoLastUpdated 列を現在のユーザ名に設定します。

CREATE TABLE mytest (
    Name VARCHAR(48),
    WhoLastUpdated VARCHAR(48) DEFAULT CURRENT_USER ON UPDATE CURRENT_USER )

列に COMPUTECODE データ制約も存在する場合、ON UPDATE 節を指定することはできません。それらを参照すると、コンパイルまたは準備時に SQLCODE -1 エラーが返されます。

description

InterSystems SQL で提供されている %DESCRIPTION キーワードは、テーブルまたは列の説明を挿入するために使用します。%DESCRIPTION の後には、一重引用符で囲んだテキスト文字列の description を続けます。このテキストの長さに制限はなく、空白スペースを含むすべての文字を使用できます(説明文字列内の一重引用符は、二重引用符で代用します。例えば、'Joe''s Table' のようになります)。1 つのテーブルには 1 つの %DESCRIPTION を使用できます。テーブルの各列には、データ型の後にそれぞれ独自の %DESCRIPTION を指定できます。テーブル全体の %DESCRIPTION を複数指定すると、SQLCODE -82 エラーが発行されます。列の %DESCRIPTION を複数指定すると、最後に指定された %DESCRIPTION のみが保持されます。ALTER TABLE を使用して既存の説明を変更することはできません。

対応する永続クラス定義では、説明は、対応するクラス (テーブル) 構文またはプロパティ (列) 構文の 1 つ前の行に、3 つのスラッシュが付けられて表示されます。例えば、/// Joe's Table のようになります。対応する永続クラスの "クラス・リファレンス" では、テーブルの説明は、上部のクラス名と SQL テーブル名の直後に表示されます。列の説明は、対応するプロパティ構文の直後に表示されます。

%DESCRIPTION テキストを表示するには、INFORMATION.SCHEMA.TABLESOpens in a new tab または INFORMATION.SCHEMA.COLUMNSOpens in a new tabDESCRIPTION プロパティを使用します。例:

SELECT COLUMN_NAME,DESCRIPTION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MyTable'

sqlCollation

列の値をソートするために使用される照合タイプ。SQL 照合タイプ (%EXACT、%MINUS、%PLUS、%SPACE、%SQLSTRING、%SQLUPPER、%TRUNCATE、または %MVR) のいずれかとして指定します。照合のキーワードでは、大文字と小文字は区別しません。プログラミングを明確にする目的で、照合パラメータの前にオプション・キーワードの COLLATE を指定することを推奨します。ただし、このキーワードは必須ではありません。これらのさまざまな照合パラメータ・キーワードの先頭のパーセント記号 (%) もオプションです。

既定は、ネームスペースの既定の照合です (変更していない場合は %SQLUPPER です)。%SQLSTRING、%SQLUPPER、および %TRUNCATE は、オプションの最大長のトランケーション引数である、括弧で囲んだ整数を指定できます。照合の詳細は、"テーブルのフィールド/プロパティ定義の照合" を参照してください。

%EXACT 照合は、ANSI (または Unicode) 文字の照合順に従います。大文字/小文字を区別する文字列照合を行い、先頭および末尾の空白およびタブ文字を認識します。

%SQLUPPER 照合は、照合目的ですべての文字を大文字に変換します。大文字と小文字を区別しない照合の詳細は、"%SQLUPPER" 関数を参照してください。

%SPACE および %SQLUPPER 照合はデータに空白を追加します。これにより、NULL と数値の文字列照合が強制されます。

%SQLSTRING、%SQLUPPER、および %STRING 照合では、括弧で囲む必要のある maxlen パラメータをオプションで使うことができます。maxlen は切り捨てを命令する整数で、照合の実行時に対象とする最大文字数を指定します。このパラメータは、サイズの大きなデータ値を持つ列にインデックスを作成するときに便利です。

%PLUS および %MINUS 照合は、NULL をゼロ (0) 値として処理します。

InterSystems SQL には、これらの照合タイプのほとんどに対応する関数があります。詳細は、%EXACT%SQLSTRING%SQLUPPER%TRUNCATE の各関数を参照してください。

ObjectScript では、データ照合変換のために %SYSTEM.UtilOpens in a new tab クラスの Collation()Opens in a new tab メソッドが提供されています。

Note:

ネームスペースの既定の照合を %SQLUPPER (大文字/小文字の区別なし) から %SQLSTRING (大文字/小文字の区別あり) などの他の照合タイプに変更するには、以下のコマンドを使用します。

  WRITE $$SetEnvironment^%apiOBJ("collation","%Library.String","SQLSTRING")

このコマンドを発行した後に、インデックスを削除し、すべてのクラスを再コンパイルしてから、再度インデックスを構築する必要があります。他のユーザがテーブルのデータにアクセスしている間はインデックスを再構築しないでください。再構築すると、クエリ結果が不正確になる可能性があります。

shardKeyColumn

シャード・キーとして使用される 1 つの列または列のコンマ区切りのリストです。shardKeyColumn は、SHARD KEY 節内のテーブル列リストの閉じ括弧の直後、かつ WITH 節 (指定される場合) の前に指定します。シャード・キー定義をテーブル列リスト内の要素として指定することは、下位互換性保持のためにサポートされていますが、両方の場所でシャード・キーを定義すると、SQLCODE -327 エラーが生成されます。

RowID 列をシャード・キーとして定義することはできません。ただし、作成されたテーブルに IDENTITY 列または IDKEY が含まれている場合は、これらの列のどちらかをシャード・キーとして定義できます。

シャード・キーの選択の詳細は、"シャード・キーの選択" を参照してください。

coshardKeyColumn

coshardTable で定義したテーブルのシャード・キーとのコシャード結合で使用するシャード・キー列の名前です。coshardKeyColumn は、COSHARD WITH 構文 (SHARD KEY (coshardKeyColumn) COSHARD WITH coshardTable) で指定します。

coshardTable

作成中のテーブルがコシャードする既存のテーブルの名前。COSHARD WITH 節で指定されたテーブルは、システムによって割り当てられたシャード・キーを持つシャード・テーブルである必要があります。

このテーブルを指定すると、シャード・テーブルの ShardKey インデックスに CoshardWith インデックス・キーワードが設定されます。この CoshardWith インデックス・キーワードは、テーブルを投影するクラスと等しくなります。

クエリで指定したどのシャード・テーブルがコシャードされるか確認するには、Cosharding コメント・オプションを表示します。

pName = pValue

pName という名前のクラス・パラメータを pValue の値に設定する、%CLASSPARAMETER の名前と値のペア。コンマ区切りの名前と値のペアを使用して、複数の %CLASSPARAMETER 節を指定できます。例: WITH %CLASSPARAMETER DEFAULTGLOBAL = '^GL.EMPLOYEE', %CLASSPARAMETER MANAGEDEXTENT 0等号または少なくとも 1 つのスペースを使用して、名前と値を区切ります。クラス・パラメータ値はリテラル文字列および数字で、定数値として定義する必要があります。

現在使用されているクラス・パラメータには、ALLOWIDENTITYINSERTDATALOCATIONGLOBALOpens in a new tabDEFAULTGLOBALOpens in a new tabDSINTERVALOpens in a new tabDSTIMEOpens in a new tabEXTENTQUERYSPECOpens in a new tabEXTENTSIZEOpens in a new tabGUIDENABLEDOpens in a new tabMANAGEDEXTENTOpens in a new tabREADONLYOpens in a new tabROWLEVELSECURITYOpens in a new tabSQLPREVENTFULLSCANOpens in a new tabUSEEXTENTSETOpens in a new tabVERSIONCLIENTNAMEOpens in a new tabVERSIONPROPERTYOpens in a new tab などがあります。これらのクラス・パラメータの説明は、"%Library.PersistentOpens in a new tab" クラスを参照してください。

USEEXTENTSETOpens in a new tab および DEFAULTGLOBALOpens in a new tab クラス・パラメータを使用して、テーブル・データ・ストレージとインデックス・データ・ストレージのグローバル名前付け方式を定義できます。

IDENTIFIEDBYOpens in a new tab クラス・パラメータは非推奨です。IDENTIFIEDBY リレーションシップは、InterSystems IRIS でサポートされるように、適切な親子リレーションシップに変換する必要があります。

シャード・テーブルを定義する CREATE TABLE で、クラス・パラメータ DEFAULTGLOBALOpens in a new tabDSINTERVALOpens in a new tabDSTIMEOpens in a new tab、または VERSIONPROPERTYOpens in a new tab を定義することはできません。

必要に応じて追加のクラス・パラメータを指定できます。詳細は、"クラス・パラメータ" を参照してください。

テーブルの作成および生成

CREATE TABLE を使用して、複数の列を持つテーブル Employee を作成します。

  • EmpNum 列 (会社の従業員の ID 番号を含む) は、NULL ではない整数です。また、テーブルの主キーとして宣言され、テーブルに行が挿入されるたびに自動的にインクリメントされます。

  • 従業員の姓と名は、最大 30 文字で NULL にはできない文字列の列に格納されます。

  • 残りの列には、従業員の入社日や有給休暇、病欠日を格納します。これらの列には TIMESTAMP および INT データ型を使用します。

CREATE TABLE Employee (
    EmpNum INT NOT NULL AUTO_INCREMENT,
    NameLast CHAR(30) NOT NULL,
    NameFirst CHAR(30) NOT NULL,
    StartDate TIMESTAMP,
    AccruedVacation INT,
    AccruedSickLeave INT,
    CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum))

テーブル・スキーマを変更するには、ALTER TABLE を使用します。例えば、この文はテーブルの名前を Employee から Employees に変更します。

ALTER TABLE Employee RENAME Employees

テーブルに行を挿入するには、INSERT を使用します。例えば、この文はテーブルに必要な列のみを持つ行を挿入します。EmpNum 列も必要ですが、これは自動インクリメントされるため、指定する必要はありません。

INSERT INTO Employees (NameLast, NameFirst) VALUES ('Zubik','Jules')

挿入された行を更新するには、UPDATE を使用します。例えば、挿入された行で、この文はデータが欠落している列の 1 つに値を設定します。

UPDATE Employees SET AccruedVacation = 15 WHERE Employees.EmpNum = 1

行を削除するには、DELETE を使用します。例えば、この文は挿入された行を削除します。

DELETE FROM Employess WHERE EmpNum = 1

テーブル全体を削除するには、DROP TABLE を使用します。DROP TABLE の使用には注意が必要です。%NODELDATA キーワードを指定しない限り、このコマンドはテーブルとすべての関連付けられたデータの両方を削除します。

DROP TABLE Employess

セキュリティおよび特権

CREATE TABLE コマンドは、%CREATE_TABLE の管理者権限を必要とする、特権の必要な操作です。特権なしで CREATE TABLE コマンドを実行すると、SQLCODE -99 エラーが返されます。%CREATE_TABLE 特権をユーザまたはロールに割り当てるには、GRANT コマンドを使用します。この場合、適切な付与特権を保持していることを前提とします。CREATE TABLE AS SELECT 構文を使用する場合、query で指定されるテーブル上で SELECT 特権が必要です。管理特権はネームスペース固有のものです。詳細は、"特権" を参照してください。

既定では、CREATE TABLE のセキュリティ特権が適用されます。システム全体でこの特権の要件を構成するには、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを使用します。例: SET status=$SYSTEM.SQL.Util.SetOption("SQLSecurity",0,.oldval)現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab メソッドを呼び出します。これにより、[SQL セキュリティ有効] の設定が表示されます。既定値は 1 (有効) です。SQL セキュリティが有効な場合 (推奨)、ユーザは特権を保持しているテーブルやビューのみでアクションを実行できます。このメソッドを 0 に設定すると、この設定の変更後に開始された新しいプロセスすべてで SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、ダイナミック SQL はユーザとして “_SYSTEM” を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。

埋め込み SQL は、SQL 特権を使用しません。埋め込み SQL では、以下のように $SYSTEM.Security.Login()Opens in a new tab メソッドを使用して適切な特権を持ったユーザとしてログインできます。$SYSTEM.Security.Login() メソッドを呼び出すには、%Service_Login:Use 特権が必要です。例:

  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
  NEW SQLCODE,%msg
  &sql(CREATE TABLE MyTable (col1 INT, col2 INT))
  IF SQLCODE=0 {WRITE !,"Table created"}
  ELSE {WRITE !,"SQLCODE=",SQLCODE,": ",%msg }

詳細は、"%SYSTEM.SecurityOpens in a new tab" を参照してください。

実行コードを必要とする計算済み列で CREATE TABLE を使用する場合は、%CREATE_TABLE 特権のほかに %Development:USE 特権が必要です。ただし、このコマンドを埋め込み SQL で使用する場合を除きます。

また、%SQL.StatementOpens in a new tab クラスのコマンドを作成し、checkPriv 引数を 0 に設定した %Prepare() メソッドまたは %ExecDirectNoPriv() メソッドを使用して、特権の確認を回避することもできます。

詳細

作成されたテーブルのクラス定義

CREATE TABLE を使用して SQL テーブルを作成すると、InterSystems IRIS® は、このテーブル定義に対応する永続クラスと、列定義に対応するプロパティを自動的に作成します。

CREATE TABLE は、対応するクラスを DdlAllowed として定義します。対応するクラス定義で明示的な StorageStrategy を指定しません。既定のストレージ %Storage.Persistent を使用します。既定では、CREATE TABLE は対応するクラス定義で Final クラス・キーワードを指定します。これは、サブクラスを持てないことを示しています (既定値は 1 です。$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの SET status=$SYSTEM.SQL.Util.SetOption("DDLFinal",0,.oldval) を使用して、このシステム全体の既定値を変更できます。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab method) を呼び出します。

主キーの定義

主キーの定義はオプションです。テーブルを定義すると、生成列 RowID 列 (既定名 "ID") が自動的に作成されます。これは一意の行識別子として機能します。各レコードがテーブルに追加されると、InterSystems IRIS はそのレコードの RowID 列に、変更できない一意の正の整数を割り当てます。オプションで、一意の行識別子としても機能する主キーを定義できます。主キーにより、ユーザはアプリケーションにとって意味のある行識別子を定義できます。例えば、主キーは、従業員 ID 列、社会保障番号、患者レコード ID 列、在庫ストック番号などになります。PRIMARY KEY 節を使用して、列または列のグループを主レコード識別子として明示的に定義することができます。

主キーには、重複する値や NULL 値は設定できません (主キー・インデックス・プロパティは自動的に必須として定義されるわけではありませんが、主キー列には NULL 値を保存できないので、事実上、必須です)。主キーの照合タイプは、列そのものの定義で指定されます。

主キーとして定義されているテーブルの列をリストする方法は、"[カタログの詳細] の [制約] オプション" を参照してください。

詳細は、"主キー" を参照してください。

IDKEY の主キー

既定では、主キーは一意の IDKEY インデックスではありません。通常は、主キー値の更新や、主キーの照合タイプの設定などを行えるため、既定を推奨します。ただし、主キーを IDKEY インデックスとして定義する方が好ましい場合もあります。その場合は、その後主キーを使用するにあたって IDKEY が制限されることを考慮する必要があります。

既存の列に主キー制約を追加する場合、列が自動的に IDKEY インデックスとして定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの方法で設定されているかどうかによります。

  • SQL SET OPTION PKEY_IS_IDKEY 文

  • システム全体の $SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッド構成オプション DDLPKeyNotIDKey。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、「DDLで作成された主キーはIDキーではありませんか」と表示されます。既定値は 1 です。

  • 管理ポータルに進み、[システム管理][構成][SQL およびオブジェクトの設定][SQL] の順に選択します。[DDL を使用して作成されたテーブルの ID キーとして主キーを定義する] の現在の設定を表示します。

    • このチェック・ボックスにチェックが付いていない場合 (既定)、主キーはクラス定義の IDKEY インデックスになりません。IDKEY ではない主キーを使用したレコードへのアクセスはかなり非効率的です。 しかし、主キーの値は変更することができます。

    • このチェック・ボックスにチェックが付いている場合、DDL で主キー制約を指定していると、主キーが自動的にクラス定義の IDKEY インデックスになります。このオプションにチェックを付けると、データ・アクセスはより効率的ですが、一度設定された主キー値は変更できません。

ただし、IDENTITY 列がテーブルで定義済みであると、これらの構成設定のいずれかを使用して主キーを IDKEY として定義していても、主キーを IDKEY として定義することはできません。

InterSystems IRIS では、IDKEY インデックスに属するプロパティ (列) を SqlComputed にすることができます。例えば、親参照列などです。このプロパティは、トリガによって計算される列とする必要があります。SqlComputed として定義した IDKEY プロパティは、新規オブジェクトを初めて保存するときまたは INSERT 操作のときにのみ計算されます。UPDATE 計算は、IDKEY インデックスに属する列を更新できないため、サポートされていません。

主キーなし

多くの場合、明示的に主キーを定義する必要があります。ただし、主キーが指定されない場合、InterSystems IRIS では、以下のルールに基づいて、別の列を ODBC/JDBC プロジェクションの主キーとして使用します。

  1. 単一の列上に IDKEY インデックスが存在する場合、IDKEY 列を SQLPrimaryKey 列として報告する。

  2. そうでない場合、クラスが SqlRowIdPrivate=0 (既定) で定義されていれば、RowID 列を SQLPrimaryKey 列として報告する。

  3. そうでない場合、IDKEY インデックスが存在すると、IDKEY 列を SQLPrimaryKey 列として報告する。

  4. そうでない場合、SQLPrimaryKey を報告しない。

複数の主キー

主キーは 1 つしか定義できません。既定では、InterSystems IRIS は、主キーが既に存在する場合に主キーを定義しようとしたり、同じ主キーを 2 回定義しようとしたりすると、それを拒否して SQLCODE -307 エラーを発行します。主キーの第 2 定義が最初の定義と同じ場合も SQLCODE -307 エラーを発行します。現在の構成を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[既存キーに対して DDL の Create Primary Key を許可] 設定が表示されます。既定値は 0 (いいえ) で、これが推奨される構成設定です。このオプションが 1 (はい) に設定されている場合、InterSystems IRIS は既存の主キー制約を削除し、最後に指定された主キーをテーブルの主キーとして設定します。

管理ポータル、[システム管理][構成][SQL とオブジェクトの設定][SQL] から [冗長な DDL ステートメントを無視] チェック・ボックスにチェックを付けることにより、このオプション (および他の同様の作成、変更、および削除のオプション) をシステム全体で設定できます。

例えば、以下に 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 エラーを生成します。

外部キーの定義

外部キーは他のテーブルを参照する列です。外部キー列に保存された値は、他のテーブル内のレコードを一意に識別します。この参照の最も単純な形式を以下の例に示します。この例では、外部キーが Customers テーブルの主キー列 CustID を暗黙的に参照しています。

CREATE TABLE Orders (
    OrderID INT UNIQUE NOT NULL,
    OrderItem VARCHAR,
    OrderQuantity INT,
    CustomerNum INT,
    CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
    CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID))

通常、外部キーは他のテーブルの主キー列を参照します。ただし、外部キーは RowID (ID) または IDENTITY 列を参照できます。外部キー参照は参照されるテーブルに常に存在し、一意として定義される必要があります。参照される列は重複値または NULL を持つことはできません。

外部キー定義では以下の内容を指定できます。

  • 1 つの列名: FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID)。外部キー列 (CustomerNum) および参照される列 (CustID) は異なる名前でも (同じ名前でも) かまいませんが、データ型と列の制約は同じでなければなりません。

  • コンマで区切られた列名のリスト: FOREIGN KEY (CustomerNum,SalespersonNum) REFERENCES Customers (CustID,SalespID)。外部キー列および参照される列は、列の数およびリストでの順序が一致している必要があります。

  • 省略された列名: FOREIGN KEY (CustomerNum) REFERENCES Customers

  • 明示的な RowID 列: FOREIGN KEY (CustomerNum) REFERENCES Customers (%ID)。省略された列名と同義です。テーブルのクラス定義に SqlRowIdName が含まれる場合、この値を明示的な RowID として指定できます。

外部キーを定義して、参照される列名を省略した場合、外部キーの既定は次のようになります。

  1. 指定されたテーブルで定義されている主キー列。

  2. 指定されたテーブルに主キーが定義されていない場合、外部キーの既定は指定されたテーブルで定義されている IDENTITY 列になります。

  3. 指定されたテーブルに主キーも IDENTITY 列も定義されていない場合、外部キーの既定は RowID になります。これが発生するのは、指定されたテーブルで RowID をパブリックとして定義した場合のみです。指定されたテーブル定義でこれを明示的に行うには、%PUBLICROWID キーワードを指定するか、対応するクラス定義で SqlRowIdPrivate=0 (既定) を指定します。指定されたテーブルで RowID をパブリックとして定義していない場合、InterSystems IRIS は SQLCODE -315 エラーを発行します。RowID で外部キーを定義する際は、参照される列名を省略する必要があります。ID を参照される列名として明示的に指定しようとすると、SQLCODE -316 エラーが発生します。

上記のいずれの既定も適用されない場合は、SQLCODE -315 エラーが発行されます。

外部キー列および外部キーに対して生成された制約名として定義されているテーブルの列をリストする方法は、"[カタログの詳細] の [制約] オプション" を参照してください。

次の例に示すように、クラス定義では、親テーブルの IDKEY プロパティに基づく列を含む外部キーを指定できます。

  ForeignKey Claim(CheckWriterPost.Hmo,Id,Claim) References SQLUser.Claim.Claim(DBMSKeyIndex);

子の外部キーに定義された親列は親クラスの IDKEY インデックスの一部である必要があるため、このタイプの外部キーでサポートされている参照アクションは NO ACTION のみです。

  • 存在しないテーブルを外部キーで参照すると、SQLCODE -310 エラーが発行され、%msg に補足情報が示されます。

  • 存在しない列を外部キーで参照すると、SQLCODE -316 エラーが発行され、%msg に補足情報が示されます。

  • 一意ではない列を外部キーで参照すると、SQLCODE -314 エラーが発行され、%msg に補足情報が示されます。

外部キー列が 1 つの列を参照する場合は、2 つの列で、データ型と列のデータ制約が同じである必要があります。

親子リレーションシップでは、子の順序は定義されていません。アプリケーション・コードは特定の順序に依存しないでください。

読み取り専用としてマウントされたデータベースのクラスを参照する外部キー制約を定義できます。FOREIGN KEY を定義するには、ユーザは、参照されるテーブルまたは参照されるテーブルの列の REFERENCES 特権を持っている必要があります。REFERENCES 特権は、ダイナミック SQL または xDBC を介して CREATE TABLE を実行する場合に必要になります。

シャード・テーブルと外部キー

キー・テーブルがシャード化され、外部キー・テーブルがシャード化されていない場合、キー・テーブルがシャード化されておらず、外部キー・テーブルがシャード化されている場合、キー・テーブルと外部キー・テーブルの両方がシャード化されている場合など、シャード・テーブルとシャード化されていないテーブルのあらゆる組み合わせについて、外部キーがサポートされています。参照されるテーブルのキーはシャード・キーでも別のキーでもかまいません。外部キーは 1 つの列でも、複数の列でもかまいません。

NO ACTION は、シャード・テーブルでサポートされている唯一の参照アクションです。

詳細は、"シャード・クラスタにおけるクエリ" を参照してください。

暗黙的な外部キー

すべての外部キーは明示的に定義することをお勧めします。明示的な外部キーが定義されている場合、InterSystems IRIS はこの制約を報告し、暗黙的な外部キー制約は定義されません。

ただし、暗黙的な外部キーを ODBC/JDBC および管理ポータルに投影することもできます。これらの暗黙的な外部キーは、NO ACTION の UPDATE および DELETE 参照アクションとして報告されます。参照アクションが適用されていないため、この暗黙的な参照外部キーは、真の外部キーではありません。この参照に対して報告されるこの外部キーの名前は、"IMPLICIT_FKEY_REFERENCE__"_columnname となります。この参照を外部キーとして報告する動作は、サードパーティ製ツールとの相互運用性のために提供されています。

ビットマップ・エクステント・インデックス

CREATE TABLE を使用してテーブルを作成する場合、既定では、InterSystems IRIS は自動的に対応するクラスのビットマップ・エクステント・インデックスを定義します。ビットマップ・エクステント・インデックスの SQL マップ名は、%%DDLBEIndex です。

Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ];

このビットマップ・エクステント・インデックスは、以下の状況では作成されません

  • テーブルはグローバル一時テーブル (CREATE TABLE GLOBAL TEMPORARY TABLE ...) として定義されます。

  • テーブルが明示的な IDKEY インデックスを定義している。

  • テーブルに、MINVAL=1 が指定されていない、定義済みの IDENTITY 列がある。

  • $SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの DDLDefineBitmapExtent オプションが、既定値をシステム全体でオーバーライドするように 0 に設定されている。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab メソッドを呼び出します。これにより、[DDL CREATE TABLE 文で作成されたクラスでビットマップ・エクステント・インデックスを定義しますか] 設定が表示されます。

ビットマップ・インデックスを作成した後に、CREATE BITMAPEXTENT INDEX コマンドを、ビットマップ・エクステント・インデックスが自動的に定義されたテーブルに対して実行すると、それ以前に定義されているビットマップ・エクステント・インデックスは、CREATE BITMAPEXTENT INDEX 文により指定された名前に変更されます。

既存のビットマップ・エクステント・インデックスを自動的に削除する DDL 操作については、“ALTER TABLE” を参照してください。

詳細は、"ビットマップ・エクステント・インデックス" を参照してください。

IDENTITY キーワードを使用した名前付き RowId 列の作成

InterSystems SQL では、テーブルごとに RowID 列が自動的に作成されます。この列には、一意のレコード ID となるシステム生成の整数が格納されます。オプションの IDENTITY キーワードを使用すると、RowID レコード ID 列と同じプロパティを持つ名前付きの列を定義できます。IDENTITY 列は、システムが生成する一意の整数値を値として持つ単一列の IDKEY インデックスとして動作します。

IDENTITY 列を定義することにより、IDKEY としての主キーの定義が回避されます。

システムが生成するあらゆる ID 列と同様に、IDENTITY 列は以下の特性を持ちます。

  • IDENTITY 列として定義できるのは、テーブルごとに 1 つの列のみです。複数の IDENTITY 列を定義しようとすると、SQLCODE -308 エラーが発生します。

  • IDENTITY 列のデータ型は整数データ型であることが必要です。データ型を指定しないと、データ型は自動的に BIGINT として定義されます。INTEGER や SMALLINT など、任意の整数データ型を指定できます。RowID のデータ型と一致するように BIGINT を使用することをお勧めします。NOT NULL や UNIQUE のような列制約は受け入れられますが無視されます。

  • データ値はシステムが生成します。値は一意で、0 以外の正の整数です。

  • 既定では、IDENTITY 列のデータ値をユーザが指定することはできません。既定では、INSERT 文は IDENTITY 列の値を指定しません。指定しようとしてもできません。これを実行しようとすると、SQLCODE -111 エラーが生成されます。IDENTITY 列の値を指定できるかどうかを確認するには、$SYSTEM.SQL.Util.GetOption("IdentityInsert")Opens in a new tab メソッドを呼び出します。既定値は 0 です。現在のプロセスに対してこの設定を変更するには、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを SET status=$SYSTEM.SQL.Util.SetOption("IdentityInsert",1,.oldval) のように呼び出します。テーブル定義で %CLASSPARAMETER ALLOWIDENTITYINSERT=1 を指定することもできます。ALLOWIDENTITYINSERT=1 を指定すると、SetOption("IdentityInsert") を使用して適用された設定がオーバーライドされます。詳細は、"INSERT" 文を参照してください。

  • IDENTITY 列のデータ値を UPDATE 文で変更することはできません。これを実行しようとすると、SQLCODE -107 エラーが生成されます。

  • システムが自動的に、IDENTITY 列上の主キーを ODBC および JDBC に投影します。CREATE TABLE 文または ALTER TABLE 文によって、IDENTITY 列または IDENTITY 列を含む列セット上に主キー制約または一意の制約を定義すると、その制約定義は無視されます。したがって、対応する主キーまたは一意のインデックス定義が作成されることはありません。

  • SELECT * 文はテーブルの IDENTITY 列を返します

INSERTUPDATE、または DELETE 操作に続いて LAST_IDENTITY 関数を使用すると、直前に変更したレコードの IDENTITY 列の値を返すことができます。IDENTITY 列が定義されていない場合、LAST_IDENTITY は直前に変更したレコードの RowID 値を返します。

これらの SQL 文は、IDENTITY 列を持つテーブルを作成し、そのテーブルに行を挿入し、作成されたテーブルに対して IDENTITY 列の値を生成します。

CREATE TABLE Employee (
    EmpNum INT NOT NULL,
    MyID IDENTITY NOT NULL,
    Name VARCHAR(30) NOT NULL,
    CONSTRAINT EmployeePK PRIMARY KEY (EmpNum))
INSERT INTO Employee (EmpNum,Name) 
SELECT ID,Name FROM SQLUser.Person WHERE Age >= '25'

この場合、主キー EmpNum は別のテーブルの ID 列から取得されます。EmpNum の値は一意の整数になりますが、WHERE 節のため、この列の数字が連続しない場合もあります。IDENTITY 列の MyID は、ユーザから可視の一意の連続した整数を、各レコードに割り当てます。

シャード・テーブルの制限事項

シャード・テーブルを定義する際は、以下の制限があることに留意してください。

  • シャード・テーブルはシャード環境でのみ使用できます。シャード化されていないテーブルは、シャード環境またはシャード化されていない環境で使用できます。すべてのテーブルがシャーディングに適した候補とは限りません。シャード環境で最適なパフォーマンスを得るには、一般に、シャード・テーブル (一般的に非常に大きなテーブル) とシャード化されていないテーブルの組み合わせを使用します。詳細は、"シャーディングの効果の評価" および "シャーディングに関する既存のテーブルの評価" を参照してください。

  • CREATE TABLE または永続クラス定義のいずれかを使用して、シャード・テーブルとしてテーブルを定義する必要があります。ALTER TABLE を使用して、シャード・キーを既存のテーブルに追加することはできません。

  • シャード・キーが一意キーのサブセットでない限り、シャード・テーブル列の一意制約によって、挿入/更新のパフォーマンスに重大な悪影響が生じることがあります。詳細は、“シャーディングによるデータ量に応じた InterSystems IRIS の水平方向の拡張” にある "一意制約の評価" を参照してください。

  • アトミック性を必要とする複雑なトランザクションに含まれるテーブルをシャード化することはお勧めしません。

  • シャード・テーブルに ROWVERSION データ型または SERIAL (%Library.Counter) データ型の列を含めることはできません。

  • シャード・テーブルでは、VERSIONPROPERTYOpens in a new tab クラス・パラメータを指定することはできません。

  • シャード・キーを指定するには、現在のネームスペースがシャーディング用に構成されている必要があります。現在のネームスペースがシャーディング用に構成されていない場合、シャード・キーを指定した CREATE TABLE は SQLCODE -400 エラーで失敗します。シャーディング用のネームスペースの構成の詳細は、"シャード・マスタ・データ・サーバの構成" を参照してください。

  • シャード・テーブルでサポートされている唯一の参照アクションは、NO ACTION です。他の参照アクションはすべて、SQLCODE -400 エラーになります。

  • シャード・キー列では、%EXACT、%SQLSTRING、または %SQLUPPER 照合のみを使用でき、切り捨ては行われません。詳細は、"シャード・クラスタにおけるクエリ" を参照してください。

シャーディングの詳細は、"ターゲット・シャード・テーブルの作成" を参照してください。

レガシー・オプション

%EXTENTSIZE キーワードと %NUMROWS キーワード

%EXTENTSIZE キーワードと %NUMROWS キーワードは、作成中のテーブルに想定される行数を格納するためのオプションを提供します。InterSystems SQL クエリ・オプティマイザは、この値を使用してクエリ・プランのコストを見積もります。テーブルでこれらの値のいずれかを定義できますが、両方はできません。例:

CREATE TABLE Sample.DaysInAYear (
    %EXTENTSIZE 366, 
    MonthName VARCHAR(24),
    Day INTEGER)

2021 年 2 月以降、テーブルに対して初めてクエリを実行するときに、InterSystems IRIS はテーブル・サイズなどの統計を自動的に収集します。SQL クエリ・オプティマイザはこれらの生成された統計を使用してクエリ・プランを提案するため、%EXTENTSIZE キーワードと %NUMROWS キーワードが不要になります。テーブル統計を使用したテーブルの最適化の詳細は、"クエリ・オプティマイザで使用するテーブル統計" を参照してください。

%FILE キーワード

%FILE キーワードは、テーブルを示すファイル名を指定するオプションを提供します。例:

CREATE TABLE Employee (
    %FILE 'C:\SQL\employee_table_desc.txt',
    EmpNum INT PRIMARY KEY,
    NameLast VARCHAR(30) NOT NULL,
    NameFirst VARCHAR(30) NOT NULL,
    StartDate TIMESTAMP %Description 'MM/DD/YY')

このキーワードは推奨されません。代わりに、%DESCRIPTION キーワードを使用してテーブルについて説明します。

列リストの括弧内のシャード・キーと %CLASSPARAMETER

古い CREATE TABLE コードには、シャード・キー定義と %CLASSPARAMETER 節が、テーブル要素を含む括弧内にコンマで区切られた要素として含まれる場合があります。例: CREATE TABLE myTable(Name VARCHAR(50), DOB DATE, %CLASSPARAMETER USEEXTENTSET = 1)。これらの節を閉じ括弧の後に指定する構文を推奨します。例: CREATE TABLE myTable(Name VARCHAR(50), DOB TIMESTAMP) WITH %CLASSPARAMETER USEEXTENTSET = 1。これらの節を重複して指定すると、SQLCODE -327 エラーが生成されます。

互換性のみにサポートされるオプション

InterSystems SQL は、構文解析の目的にのみ以下の CREATE TABLE オプションをサポートし、既存の SQL コードから InterSystems SQL への変換を支援します。これらのオプションは、実際には機能しません。

{ON | IN} dbspace-name LOCK MODE [ROW | PAGE] [CLUSTERED | NONCLUSTERED] WITH FILLFACTOR = literal MATCH [FULL | PARTIAL] CHARACTER SET identifier COLLATE identifier  /* But COLLATE keyword is still used*/ NOT FOR REPLICATION

関連項目

FeedbackOpens in a new tab