17.10 - 識別列の指定に関するルール - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)
テーブル定義の一部としての識別列の指定には、次のルールと制約事項が適用されます。
  • テーブルごとに1つの識別列のみを指定できます。
  • 識別列は、テーブルに定義されている最初の列である必要はありません。
  • 識別列は、プライマリ インデックス列である必要はありません。

    例えば、NUPIテーブルも識別列を持つことができます。

  • パーティション化されていないNoPIテーブルには、識別列を指定できません。
  • 列パーティション テーブルには、識別列を指定できます。
  • Teradata Unityの制御下でバルク データ ロード ユーティリティを使用してロードする予定があるテーブルには、識別列を指定しないでください。Vantageはシステムによって異なる順序で行を処理するからです。このため、すべてのシステムで同じ行に同じ識別値が割り当てられることは保証されません。
  • 識別列は、以下のタイプのインデックスの任意のの一部になることはできません。
    • 複合プライマリ インデックス
    • 複合セカンダリ インデックス
    • 結合インデックス
    • ハッシュ インデックス
    • 値順インデックス
  • プライマリ インデックスとして識別列を持つテーブルでのAtomic Upsert操作を実行することはできません。
  • 識別列は、真数データ型で定義する必要があります。真数データ型のANSI SQL:2011定義については、<Teradata Vantage™ - データベースの設計、B035-1094>または<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。
    識別列のデータ型がBIGINTとして指定されている場合でも、システムが生成する最大識別列値は、DECIMAL(18,0)、NUMBER(18,0)、またはNUMERIC(18,0)データ型で格納できるサイズに制限されます。
    以下は、識別列として有効な数値データ型の例です。
    • BYTEINT
    • DECIMAL(n,0)
    • INTEGER
    • NUMERIC(n,0)
    • NUMBER(n,0)
    • SMALLINT
    • BIGINT

      次の表に、様々な識別列のデータ型に関するMAXVALUEおよびMINVALUEデフォルト値をリストします。

    データ型 デフォルトMAXVALUE デフォルトMINVALUE
    DECIMAL(1,0)

    NUMERIC(1,0)

    9 -9
    DECIMAL(2,0)

    NUMERIC(2,0)

    99 -99
    ... ... ...
    DECIMAL(18,0)

    NUMERIC(18,0)

    NUMBER(18,0)

    DBS制御パラメータMaxDecimalの値が38に設定されている場合でも、システムが生成する最大識別列値は、以下のいずれかのデータ型で格納できるサイズに制限されます。
    • DECIMAL(18,0)
    • NUMBER(18,0)
    • NUMERIC(18,0)
    999,999,999,999,999,999 -999,999,999,999,999,999
    BYTEINT 127 -127
    SMALLINT 32,767 -32,767
    INTEGER 2,147,483,647 -2,147,483,647
    BIGINT

    識別列のデータ型がBIGINTとして指定されている場合でも、システムが生成する最大識別列値は、DECIMAL(18,0)、NUMBER(18,0)、またはNUMERIC(18,0)データ型で格納できるサイズに制限されます。

    9,223,372,036,854,775,807 -9,223,372,036,854,775,807
以下は、識別列としては無効なデータ型の例です。
  • DateTime、INTERVAL、PERIOD、Geospatial、UDT、ARRAY、VARRAY、BLOB、CLOBの各データ型を含むすべての非数値データ型 UDTが、有効である正確な数値型1つ(DISTINCT型UDT)または複数(STRUCTURED型UDT)に基づいている場合でも、これは当てはまります。
  • DECIMAL(n,m) (mは0以外)
  • DOUBLE PRECISION
  • FLOAT
  • NUMERIC(n,m) (mは0以外)
  • NUMBER (概算タイプ)
  • REAL
    テーブルのタイプ IDENTITY列 説明
    MULTISET GENERATED ALWAYS 重複行を持つことができません。
    SET
    • GENERATED ALWAYS
    • GENERATED BY DEFAULT
    MULTISET GENERATED BY DEFAULT 重複行を持つことができます。
  • SETテーブルのGENERATED BY DEFAULT IDENTITY列に値を挿入する場合、挿入される行(識別列に挿入する値だけではない)は固有である必要があります。そうでないと、システムはその行を受け入れません。
  • MULTISETテーブル内のGENERATED BY DEFAULT IDENTITY列に値を挿入し、それらの値が常に固有である必要がある場合、列をUPI、USI、PRIMARY KEY、またはUNIQUEに指定することによって列が固有になるように明示的に制約する必要があります。この場合、Vantageはnullをすべて互いに等しいものとして扱うので、UNIQUEに制約されている列に挿入できるnullは1つだけです。したがって、通常、そのような列はUNIQUEとしてだけでなくNOT NULLとしても定義するのがよいとされています。
    IDENTITY列 ユーザー定義の挿入値のアクション
    GENERATED ALWAYS システム生成の識別値で置き換えられます。
    GENERATED BY DEFAULT その他の制約がない限り、それらの値が受け入れられます。

NO CYCLEで修飾されたGENERATED BY DEFAULT AS IDENTITYを指定した列は、識別列にnullを含む挿入行に対してのみ固有列値が生成されます。

GENERATED BY DEFAULT列値の固有性を確実にするには:
  • NO CYCLEを指定しなければなりません。
  • 指定するすべてのユーザー指定値は、システム生成値の範囲外でなければなりません。
  • ユーザー指定値の固有性をユーザー自身が定義しなければなりません。
  • 識別列に対して以下の列属性のいずれも指定することはできません。
    • DEFAULT
    • BETWEEN
    • COMPRESS
    • CHECK制約
    • FOREIGN KEY … REFERENCES制約