OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

テーブルの任意の位置に列を追加する方法

公開日:
更新日:
基本操作
#テーブル

はじめに

Verticaでは、既存テーブルの明示的な位置を指定して列を追加することはできません。
そのため、任意の位置に列を追加するためには、主に以下のような手順を踏む必要があります。
1) 構成したい列構成で別途ワークテーブルを作成
2) 既存テーブルからワークテーブルにデータをコピー
3) 既存テーブルとワークテーブルを入れ替える

本記事では、テーブルの任意の位置に列を追加する詳細な手順をご紹介します。

テーブルの任意の位置に列を追加する方法

概要

1. 既存テーブル(CUSTOMER)のDDL(CREATE TABLE文)を出力
2. 任意の位置に列を追加したワークテーブル(CUSTOMER_WK)を作成
3. 既存テーブルからワークテーブルへデータコピー(INSERT INTO ~ SEELCT)
4. ワークテーブルを最適化
5. RENAMEにて既存テーブルとワークテーブルを入れ替え
6. ワークテーブルをDROP

例)CUSTOMERテーブルのC_PHONE列の後にC_ADD列を追加する

1. 既存テーブル(CUSTOMER)のDDL(CREATE TABLE文)を出力

#テーブル定義を確認
dbadmin=> ¥d CUSTOMER
                                         List of Fields by Tables
 Schema |  Table   |    Column    |     Type      | Size | Default | Not Null | Primary Key | Foreign Key
--------+----------+--------------+---------------+------+---------+----------+-------------+-------------
 public | CUSTOMER | C_CUSTKEY    | numeric(10,0) |    8 |         | f        | f           |
 public | CUSTOMER | C_NAME       | varchar(25)   |   25 |         | f        | f           |
 public | CUSTOMER | C_ADDRESS    | varchar(25)   |   25 |         | f        | f           |
 public | CUSTOMER | C_CITY       | char(10)      |   10 |         | f        | f           |
 public | CUSTOMER | C_NATION     | char(15)      |   15 |         | f        | f           |
 public | CUSTOMER | C_REGION     | char(12)      |   12 |         | f        | f           |
 public | CUSTOMER | C_PHONE      | char(15)      |   15 |         | f        | f           |
 public | CUSTOMER | C_MKTSEGMENT | char(10)      |   10 |         | f        | f           |
(8 rows)

#テーブル定義をエクスポート
dbadmin=> select export_tables('','CUSTOMER');
                                                                 export_tables
----------------------------------------------------------------------------------------------------

CREATE TABLE public.CUSTOMER
(
    C_CUSTKEY numeric(10,0),
    C_NAME varchar(25),
    C_ADDRESS varchar(25),
    C_CITY char(10),
    C_NATION char(15),
    C_REGION char(12),
    C_PHONE char(15),
    C_MKTSEGMENT char(10)
);

(1 row)

2. 任意の位置に列を追加したワークテーブル(CUSTOMER_WK)を作成

先ほどの手順で出力したテーブル定義をもとに、CUSTOMERテーブルのC_PHONE列の後にC_ADD列を追加したワークテーブル(CUSTOMER_WK)を作成します。

#カラムを追加したワークテーブルの作成
dbadmin=> CREATE TABLE public.CUSTOMER_WK
dbadmin-> (
dbadmin(>     C_CUSTKEY numeric(10,0),
dbadmin(>     C_NAME varchar(25),
dbadmin(>     C_ADDRESS varchar(25),
dbadmin(>     C_CITY char(10),
dbadmin(>     C_NATION char(15),
dbadmin(>     C_REGION char(12),
dbadmin(>     C_PHONE char(15),
dbadmin(>     C_ADD int,        --追加したカラム
dbadmin(>     C_MKTSEGMENT char(10)
dbadmin(> );
CREATE TABLE

#ワークテーブルの定義を確認
dbadmin=> ¥d CUSTOMER_WK;
                                          List of Fields by Tables
 Schema |    Table    |    Column    |     Type      | Size | Default | Not Null | Primary Key | Foreign Key
--------+-------------+--------------+---------------+------+---------+----------+-------------+-------------
 public | CUSTOMER_WK | C_CUSTKEY    | numeric(10,0) |    8 |         | f        | f           |
 public | CUSTOMER_WK | C_NAME       | varchar(25)   |   25 |         | f        | f           |
 public | CUSTOMER_WK | C_ADDRESS    | varchar(25)   |   25 |         | f        | f           |
 public | CUSTOMER_WK | C_CITY       | char(10)      |   10 |         | f        | f           |
 public | CUSTOMER_WK | C_NATION     | char(15)      |   15 |         | f        | f           |
 public | CUSTOMER_WK | C_REGION     | char(12)      |   12 |         | f        | f           |
 public | CUSTOMER_WK | C_PHONE      | char(15)      |   15 |         | f        | f           |
 public | CUSTOMER_WK | C_ADD        | int           |    8 |         | f        | f           |★追加したカラム
 public | CUSTOMER_WK | C_MKTSEGMENT | char(10)      |   10 |         | f        | f           |
(9 rows)

C_PHONE列の後にC_ADD列が存在するCUSTOMER_WKテーブルを作成することができました。

3. 既存テーブルからワークテーブルへデータコピー(INSERT INTO ~ SEELCT文)

#既存テーブルのデータ件数を確認
dbadmin=> select count(*) from CUSTOMER;
  count
---------
 3750000
(1 row)

#INSERT INTO ~ SEELCT文にてワークテーブルへデータコピー
dbadmin=> INSERT /*+DIRECT*/ INTO CUSTOMER_WK
dbadmin-> (
dbadmin(> C_CUSTKEY,
dbadmin(> C_NAME,
dbadmin(> C_ADDRESS,
dbadmin(> C_CITY,
dbadmin(> C_NATION,
dbadmin(> C_REGION,
dbadmin(> C_PHONE,
dbadmin(> C_MKTSEGMENT
dbadmin(> )
dbadmin-> SELECT
dbadmin-> C_CUSTKEY,
dbadmin-> C_NAME,
dbadmin-> C_ADDRESS,
dbadmin-> C_CITY,
dbadmin-> C_NATION,
dbadmin-> C_REGION,
dbadmin-> C_PHONE,
dbadmin-> C_MKTSEGMENT
dbadmin-> FROM CUSTOMER
dbadmin-> ;
 OUTPUT
---------
 3750000
(1 row)

#ワークテーブルのデータを確認
既存テーブルのデータ件数と同じであることを確認します。

dbadmin=> select count(*) from CUSTOMER_WK;
  count
---------
 3750000
(1 row)

#データのコミット
dbadmin=> commit;
COMMIT

既存テーブルからワークテーブルへデータをコピーすることができました。

4. ワークテーブルを最適化

Verticaは新規テーブルにデータを投入した後、テーブルを最適化する必要があります。
以下の技術情報サイトの手順を参考にテーブルの最適化を実行ください。
https://www.ashisuto.co.jp/cm/analytics-database/table_dbd.html

5. RENAMEにて既存テーブルとワークテーブルを入れ替え

テーブルをRENAMEし、CUSTOMERテーブルとCUSTOMER_WKを入れ替えます。この手順により既存テーブルの任意の位置に列を追加した状態となります。

補足:VerticaのRENAMEは一度に複数のテーブルをRENAMEすることができるため、アクセス不可の時間無くテーブルを入れ替えることができます。RENAMEの詳細については、以下の技術情報サイトをご参照ください。
https://www.ashisuto.co.jp/cm/analytics-database/table_rename.html

#ALTER TABLE ~ RENAME文にてテーブル入れ替え
dbadmin=> ALTER TABLE CUSTOMER, CUSTOMER_WK, temps RENAME TO temps, CUSTOMER, CUSTOMER_WK ;
ALTER TABLE
dbadmin=> ¥d
                  List of tables
 Schema |    Name     | Kind  |  Owner  | Comment
--------+-------------+-------+---------+---------
 public | CUSTOMER    | table | dbadmin |
 public | CUSTOMER_WK | table | dbadmin |
(2 rows)

#CUTOMERテーブルにC_ADD列が追加されていることを確認
dbadmin=> select * from CUSTOMER limit 1;
 C_CUSTKEY |       C_NAME       |  C_ADDRESS  |   C_CITY   |    C_NATION     |   C_REGION   |     C_PHONE     | C_ADD | C_MKTSEGMENT
-----------+--------------------+-------------+------------+-----------------+--------------+-----------------+-------+--------------
       101 | Customer#000000101 |  eEfYAdMjnG | BRAZIL   0 | BRAZIL          | AMERICA      | 12-242-921-3794 |       | MACHINERY

CUSTOMERテーブルのC_PHONE列の後にC_ADD列が追加された状態となっていることを確認できました。

6. ワークテーブルをDROP

不要になったワークテーブルをDROPすれば、列の追加作業は完了です。

dbadmin=> drop table CUSTOMER_WK cascade;
DROP TABLE

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。