目次
サンプル | 元のテーブルとデータを作成(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);
関連の記事