ADD column_name - Teradata Database - Teradata Vantage NewSQL Engine - ADD column_name オプション、ALTER TABLE SQL文。

Teradata Vantage™ SQLデータ定義言語 構文規則および例

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/wkf1512081455740.ditamap
dita:ditavalPath
ja-JP/wkf1512081455740.ditaval
dita:id
B035-1144
Product Category
Software
Teradata Vantage

列を追加します。または、列属性を変更します。

ADD column_nameは、テーブルにすでに列が含まれている場合は列を変更し、テーブルに列が含まれていない場合は列を作成します。

column_name
追加または変更する列の名前。データベース オブジェクトの名前付けについては、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。
名前付きの収集された統計と同じ名前を持つ列を追加することはできません。
識別列を既存のテーブルに追加したり、識別列の属性だけを既存の列に追加することはできません。
ADDおよびDROPを、同一のALTER TABLEリクエストの中で、同一の列のために指定することはできません。
data type
列を追加するには、データ型を指定する必要があります。新しい列を追加する場合は、場合によっては、既存の列のデータ型と列属性を変更し、この構文を使用します。
  ADD  column_name 
 data type column attributes
NUMBERデータ型を使用した列の追加、既存の固定のNUMBER列の精度の増加、または固定のNUMBERデータ型の精度と位取りの増加が可能です。位取りと精度は、固定のNUMBER列でのみ変更できます。
浮動のNUMBER列に対して、次に示す変更はできません。
  • 精度を減少する。
  • 位取りを減少する。
  • 精度を増加しないで位取りを増加する。
  • 精度と位取りを異なる量で増加する。
明示形式を指定しない場合、新しい列は、データ型のデフォルトの形式であると仮定されます。これは、tdlocaledefユーティリティによって定義されたカスタムのデータ形式仕様(SDF)によって指定できます。<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
明示形式は、解析と文字列の検索に適用されます。
データ型とデータ型属性については、<Teradata Vantage™データ タイプおよびリテラル、B035-1143>を参照してください。列記憶域属性と制約属性については、<SQLデータ型およびリテラル>の「列とテーブルの制約」を参照してください。BLOB列、CLOB列またはXML列のサイズを増加する場合は、次の構文を使用します。
  ADD  column_name  data type column attributes 
列のサイズを縮小することはできません。
ALTER TABLEを使用して、JSONデータ型で定義された列のサイズ、文字セット、またはストレージ形式を変更することはできません。
column attributes
既存の列の属性を変更するには、この構文を使用します。
ADD  column_name  column attributes
INTO column_name
table_nameに新しい列パーティションとして列セットを追加、または指定された列セットを既存の列パーティションに追加します。
括弧を使用して、同じ列パーティションに列をグループ化します。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。
INTO column_nameは、既存の列パーティションの列を指定します。この列パーティションに新しい列が追加されます。
INTO column_nameの指定を省略すると、新しいパーティションにグループ内のすべての列が含まれるようになります。
列または列パーティションを追加するために、結合インデックスに対するALTER TABLEリクエストを使用することはできません。
列パーティションにJSONデータ型の列を含めることはできません。

例: NUMBER列の追加または変更

次のテーブルを作成するとします。

     CREATE TABLE num_tab (
       n1 NUMBER(*,3),
       n2 NUMBER,
       n3 NUMBER(*),
       n4 NUMBER(5,1));

この例では、num_tabの既存のNUMBER列の精度を変更します。

     ALTER TABLE num_tab ADD n4 NUMBER(9,1);

この例では、num_tabの元の定義の既存のNUMBER列の精度と位取りの両方を変更します。この例は、num_tabの改訂された定義に対して実行された場合は無効です。これは、前の(n4列の精度を変更した)例をTeradata Databaseが処理した後であると考えられるためです。

     ALTER TABLE num_tab ADD n4 NUMBER(10,6);

この例では、NUMBER列をnum_tabに追加します。

     ALTER TABLE num_tab ADD n6 NUMBER(12,4);

例: 列の名前変更と、その後の変更前の列名を使用した新しい列の追加

既存の列の名前を変更してから、その列の変更前の名前を使用して異なるデータ型の新しい列を作成することができます。例えば、以下の テーブル定義があるとします。

     CREATE SET TABLE t1, NO FALLBACK, NO BEFORE JOURNAL, 
                          NO AFTER JOURNAL,
       upi INTEGER NOT NULL,
       f1  FLOAT,
       d1  DECIMAL(7,2),
       i1  INTEGER)
     UNIQUE PRIMARY INDEX(upi);

f1列をf2という名前に変更してから、FLOATデータ型(今回f2という名前に変更された列に関連付けられていたデータ型)ではなくINTEGERデータ型を持つf1という名前の新しい列を追加します。

     ALTER TABLE t1 
       RENAME f1 AS f2,
       ADD    f1 INTEGER;
     *** Table has been modified. 
     *** Total elapsed time was 1 second.

i1列をi2という名前に変更してから、INTEGERデータ型(今回i2という名前に変更された列に関連付けられていたデータ型)ではなくDECIMALデータ型を持つi1という名前の新しい列を追加します。

     ALTER TABLE t1 
      RENAME i1 AS i2,
      ADD    i1 DECIMAL(8,3);
     *** Table has been modified. 
     *** Total elapsed time was 1 second.

SHOW TABLE文を使用して新しいテーブルの定義を表示します。 SHOW objectを参照してください。

     SHOW TABLE t1;
      *** Text of DDL statement returned. 
       *** Total elapsed time was 1 second.
     CREATE SET TABLE  user_name.t1, NO FALLBACK,NO BEFORE JOURNAL,
                              NO AFTER JOURNAL,CHECKSUM = DEFAULT (
       upi INTEGER NOT NULL,
       f2  FLOAT,
       d1  DECIMAL(7,2),
       i2  INTEGER,
       f1  INTEGER,
       i1  DECIMAL(8,3)
     UNIQUE PRIMARY INDEX (upi);

例: テーブルへのLOB列の追加

次の例は、partshistoryという名前のテーブルにCLOB列extended_descriptionを追加します。

    ALTER TABLE partshistory
    ADD extended_description CLOB;

例: JSON LOB以外およびLOB列のあるテーブルの変更

LOB以外およびLOB JSON列のあるテーブルのテーブル定義は以下のとおりです。

CREATE TABLE jsonTable (id INTEGER,
               jsn1 JSON(1000) CHARACTER SET LATIN,
               jsn2 JSON(1M) INLINE LENGTH 30000 CHARACTER SET LATIN);

この文では、LOB以外の列の最大長を増やします。

ALTER TABLE jsonTable ADD jsn1 JSON(2000);

この文では、LOB列の最大長を増やします。

ALTER TABLE jsonTable 
      ADD jsn2 JSON(2M) INLINE LENGTH 30000 CHARACTER SET LATIN;

例: 列パーティションへの列の追加

この例では、o_commentの単一列パーティションに2つの列を追加し、システム定義のCOLUMN形式と自動圧縮を使用して、パーティションを複数列パーティションに変更します。

以下の同等のリクエストはいずれも、ordersテーブルを変更するために同じアクションを実行します。

     ALTER TABLE orders 
     ADD (o_comment_ext1 VARCHAR(79), o_comment_ext2 VARCHAR(79))
     INTO o_comment;
     ALTER TABLE orders 
     ADD o_comment_ext1 VARCHAR(79) INTO o_comment,
     ADD o_comment_ext2 VARCHAR(79) INTO o_comment;
     ALTER TABLE orders 
     ADD (o_comment_ext1 VARCHAR(79)) INTO o_comment,
     ADD (o_comment_ext2 VARCHAR(79)) INTO o_comment;
     ALTER TABLE orders 
     ADD (o_comment_ext1 VARCHAR(79)) INTO o_comment,
     ADD o_comment_ext2 VARCHAR(79) INTO o_comment;
     ALTER TABLE orders 
     ADD o_comment_ext1 VARCHAR(79) INTO o_comment,
     ADD (o_comment_ext2 VARCHAR(79)) INTO o_comment;

これらはすべて、テーブルの各行でNULLに設定された新しい列がある次の テーブル定義を生成します。

     CREATE TABLE orders (
       o_orderkey       INTEGER NOT NULL,
       o_custkey        INTEGER,
       o_orderstatus    CHARACTER(1) CASESPECIFIC,
       o_totalprice     DECIMAL(13,2) NOT NULL,
       o_ordertsz       TIMESTAMP(6) WITH TIME ZONE NOT NULL,
       o_comment        VARCHAR(79),
       o_salesperson    VARCHAR(5),
       o_ordersubstatus CHARACTER(1) CASESPECIFIC,
       o_comment_ext1   VARCHAR(79),
       o_comment_ext2   VARCHAR(79) )
     PARTITION BY (COLUMN 
                   ALL BUT ((o_orderstatus, o_ordersubstatus),
                           (o_comment, o_comment_ext1, o_comment_ext2))
                           ADD 4,
                   RANGE_N(o_ordertsz 
                   BETWEEN TIMESTAMP '2003-01-01 00:00:00.000000+00:00'
                   AND     TIMESTAMP '2009-12-31 23:59:59.999999+00:00' 
                   EACH INTERVAL '1' MONTH) ),
     UNIQUE INDEX(o_orderkey);

例: 基本AMPインデックスを持つテーブルへの列パーティションの追加

デフォルトとして自動圧縮が適用される次のテーブル定義があるとします。

CREATE TABLE Orders
    ( o_orderkey INTEGER NOT NULL,
      o_custkey INTEGER,
      o_orderstatus CHAR(1) CASESPECIFIC,
      o_totalprice DECIMAL(13,2) NOT NULL,
      o_ordertsz TIMESTAMP(6) WITH TIME ZONE NOT NULL,
      o_comment VARCHAR(79) )
  PRIMARY AMP INDEX (o_orderkey), PARTITION BY COLUMN,
  UNIQUE INDEX (o_orderkey);

次のALTER TABLE文では、システム決定のCOLUMN形式と自動圧縮を使用して単一列パーティションを追加します。

ALTER TABLE Orders ADD o_salesperson VARCHAR(5);

これにより、テーブル定義が次のように生成されます。

CREATE TABLE Orders
    ( o_orderkey INTEGER NOT NULL,
      o_custkey INTEGER,
      o_orderstatus CHAR(1) CASESPECIFIC,
      o_totalprice DECIMAL(13,2) NOT NULL,
      o_ordertsz TIMESTAMP(6) WITH TIME ZONE NOT NULL,
      o_comment VARCHAR(79),
      o_salesperson VARCHAR(5) )
  PRIMARY AMP INDEX (o_orderkey) PARTITION BY COLUMN AUTO COMPRESS,
  UNIQUE INDEX (o_orderkey);

例: 基本AMPインデックスを持つテーブルへの別の列パーティションの追加

次のALTER TABLE文では、デフォルトとしてはシステム決定のCOLUMN形式を使用し自動圧縮を使用しないで、別の単一列パーティションを追加します。

ALTER TABLE Orders ADD o_ordersubstatus CHAR(1) CASESPECIFIC;

これにより、テーブル定義が次のように生成されます。

CREATE TABLE Orders
    ( o_orderkey INTEGER NOT NULL,
      o_custkey INTEGER,
      o_orderstatus CHAR(1) CASESPECIFIC,
      o_totalprice DECIMAL(13,2) NOT NULL,
      o_ordertsz TIMESTAMP(6) WITH TIME ZONE NOT NULL,
      o_comment VARCHAR(79),
      o_salesperson VARCHAR(5),
      o_ordersubstatus CHAR(1) CASESPECIFIC )
  PRIMARY AMP INDEX (o_orderkey)
  PARTITION BY
    COLUMN AUTO COMPRESS ALL BUT (o_ordersubstatus NO AUTO COMPRESS),
  UNIQUE INDEX (o_orderkey);

例: 基本AMPインデックスを持つテーブルへの2列パーティションの追加

次のALTER TABLE文では、デフォルトとしてはシステム決定のCOLUMN形式を使用し自動圧縮を使用しないで、2列パーティションを追加します。

ALTER TABLE Orders ADD (o_comment_ext1 VARCHAR(79), o_comment_ext2 VARCHAR(79));

これにより、テーブル定義が次のように生成されます。

CREATE TABLE Orders
    ( o_orderkey INTEGER NOT NULL,
      o_custkey INTEGER,
      o_orderstatus CHAR(1) CASESPECIFIC,
      o_totalprice DECIMAL(13,2) NOT NULL,
      o_ordertsz TIMESTAMP(6) WITH TIME ZONE NOT NULL,
      o_comment VARCHAR(79),
      o_salesperson VARCHAR(5),
      o_ordersubstatus CHAR(1) CASESPECIFIC,
      o_comment_ext1 VARCHAR(79),
      o_comment_ext2 VARCHAR(79) )
  PRIMARY AMP INDEX (o_orderkey)
  PARTITION BY
    COLUMN AUTO COMPRESS ALL BUT (
                          o_ordersubstatus NO AUTO COMPRESS,
                          (o_comment_ext1, o_comment_ext2) NO AUTO COMPRESS ),
  UNIQUE INDEX(o_orderkey);