AWS Redshift テーブルとデータをコピーする

目次

サンプル 元のテーブルとデータを作成(create tableとinsert)
  create table as select(CTAS)でテーブルを作成する
  select into fromでコピーする
  テーブル定義を作成してinsert selectでコピーする
create table  as select+分散キーとソートキーを指定

最初に元になるテーブルを作成します。

元のテーブルとデータを作成(create tableとinsert)

create tableでデータを作成しinsertでデータを登録します。
分散スタイルはredshiftの仕様です。

 

create tableでテーブルを作成します。

CREATE TABLE user1(
	id INT,
	name VARCHAR(20) not null,
	romaji VARCHAR(20),
	created_at TIMESTAMP,
	updated_at TIMESTAMP,
	primary key(id)
) DISTSTYLE EVEN

7行目は、idをPrimary keyとして指定しています。
8行目は、分散スタイルです。EVENはラウンドロビン方式です。テーブル結合がない場合に向いています。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_choosing_dist_sort.html

 

SHOW TABLE user1で確認するとテーブル定義は以下のようになります。

CREATE TABLE public.user1 (
    id integer NOT NULL ENCODE az64,
    name character varying(20) NOT NULL ENCODE lzo,
    romaji character varying(20) ENCODE lzo,
    created_at timestamp without time zone ENCODE az64,
    updated_at timestamp without time zone ENCODE az64,
    PRIMARY KEY (id)
) DISTSTYLE EVEN;

ENCODEは、圧縮エンコードです。
integer,timestampはaz64で、varcharはlzoになっています。

primary keyには自動でnot nullが付きます。

DISTSTYLEは分散スタイルです。デフォルトはAUTOになります。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Compression_encodings.html

 

Insert文でデータを登録する

INSERT INTO user1 VALUES (1,'鈴木','suzuki','20230801','20230801');
INSERT INTO user1 VALUES (1,'鈴木2','suzuki2','20230801','20230801');
INSERT INTO user1 VALUES (2,'田中','tanaka','20230801','20230801');
INSERT INTO user1 VALUES (3,'佐藤','sato','20230801','20230801');

1行目と2行目のPrimarykeyは1で重複しますが、redshiftではエラーにならないので注意が必要です。
not nullの項目には、nullで登録できません。

登録したデータは以下のようになります。

 

create table  as select(CTAS)でテーブルを作成する

create table as selectは、先頭の文字を取ってCTASとも呼ばれます。

CTASは、テーブルとデータをコピーできますが、Primary keyやnot null制約はつきません。

create table user2
AS SELECT * FROM  user1;

 

SHOW TABLE user2で確認するとテーブル定義は以下のようになります。

CREATE TABLE public.user2 (
    id integer ENCODE az64,
    name character varying(20) ENCODE lzo,
    romaji character varying(20) ENCODE lzo,
    created_at timestamp without time zone ENCODE az64,
    updated_at timestamp without time zone ENCODE az64
) DISTSTYLE AUTO;

primary keyやnot nullはついていません。
分散スタイルもAUTOになります。

登録したデータは以下のようになります。

alter tableでidをprimary keyにしようとしても以下のnullが可能の項目はPrimary keyにできないというエラーで実行できません。

ALTER TABLE user2 ADD PRIMARY KEY(id)

ERROR: can not make a nullable column a primary key

 

以下は、postgresqlのnot nullの追加ですが、redshiftではサポートしていません。

ALTER TABLE user2 ALTER COLUMN id SET NOT NULL;

ERROR: ALTER COLUMN SET NOT NULL is not supported

 

select into fromでテーブルを作成する

テーブルとデータをコピーできますが、Primary keyやnot null制約はつきません。

select * into user3 from user1

 

SHOW TABLE user3で確認するとテーブル定義は以下のようになります。

CREATE TABLE public.user3 (
    id integer ENCODE az64,
    name character varying(20) ENCODE lzo,
    romaji character varying(20) ENCODE lzo,
    created_at timestamp without time zone ENCODE az64,
    updated_at timestamp without time zone ENCODE az64
) DISTSTYLE AUTO;

primary keyやnot nullはついていません。
分散スタイルもAUTOになります。

登録したデータは以下のようになります。

alter tableでidをprimary keyにしようとしても以下のnullが可能の項目はPrimary keyにできないというエラーで実行できません。

ALTER TABLE user3 ADD PRIMARY KEY(id)

ERROR: can not make a nullable column a primary key

 

以下は、postgresqlのnot nullの追加ですが、redshiftではサポートしていません。

ALTER TABLE user2 ALTER COLUMN id SET NOT NULL;

ERROR: ALTER COLUMN SET NOT NULL is not supported

 

テーブル定義を作成してinsert selectでデータを登録する

primary key制約やnot null制約を設定できます。

CREATE TABLE user4(
	id INT,
	name VARCHAR(20) not null,
	romaji VARCHAR(20),
	created_at TIMESTAMP,
	updated_at TIMESTAMP,
	primary key(id)
) DISTSTYLE EVEN

 

データを登録するinsert文です。

INSERT INTO user4
SELECT * FROM user1

以下のようにselect文で列名を書いても登録できます。

INSERT INTO user4
SELECT id,name,romaji,created_at,updated_at FROM user1

 

create table  as select+分散キーとソートキーを指定

create table as selectでは、primary key制約やnot null制約は設定できませんが分散キーは設定できます。

create table文です。

create table user5
DISTKEY (id)
SORTKEY(romaji)
AS 
SELECT * FROM  user1;

 

SHOW TABLE user5で確認するとテーブル定義は以下のようになります。

CREATE TABLE public.user5 (
    id integer ENCODE az64
    distkey
,
        name character varying(20) ENCODE lzo,
        romaji character varying(20) ENCODE raw,
        created_at timestamp without time zone ENCODE az64,
        updated_at timestamp without time zone ENCODE az64
) DISTSTYLE KEY
SORTKEY
    (romaji);

関連の記事

AWS Redshiftでcreate table文を取得

△上に戻る