【AWS】Amazon Redshift ~ 自動採番 / IDENTITY ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/08/29/000000

で、PostgreSQL において
自動採番IDしてくれる「SERIAL / BIGSERIAL / SMALLSERIAL」(※)は、
Redshiftでは対応していないと記載した。

そこで、Redshift は、自動採番をどう対応するのか
っということを調べて、メモしておく。

※ 自動採番ID

* MySQL でいう AUTO_INCREMENT 属性

目次

【1】IDENTITY
 1)IDENTITY (seed1, step2)
 2)GENERATED BY DEFAULT AS IDENTITY (seed1, step2)
【2】使用上の注意
 1)データ型は、INT または BIGINT のみ
 2)IDの順序は保証されない
 3)デフォルト IDENTITY について
【3】サンプル

【1】IDENTITY

* 一意の自動生成する。

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

IDENTITY ( seed, step )
GENERATED BY DEFAULT AS IDENTITY ( seed, step )

1)IDENTITY (seed1, step2)

* seed1 として指定された値で始まり、step2 として指定された数が増分

2)GENERATED BY DEFAULT AS IDENTITY (seed1, step2)

* 列がデフォルトの IDENTITY 列であることを指定し、
 一意の値を列に自動的に割り当てることができるようにする句

【2】使用上の注意

1)データ型は、INT または BIGINT のみ
2)IDの順序は保証されない
3)デフォルト IDENTITY について

1)データ型は、INT または BIGINT のみ

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

より抜粋
~~~~~~~~~~~
IDENTITY 列のデータ型は、INT または BIGINT にする必要があります。
~~~~~~~~~~~

2)IDの順序は保証されない

* データが並行(パラレル)で実行されるので、IDの順序は保証されない

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

より抜粋

IDENTITY(seed, step)

INSERT INTO [tablename] SELECT * FROM または COPY ステートメントを使用して
テーブルをロードすると、データはパラレルにロードされ、ノードスライスに分散されます。
ID 値が一意であることを確認するために、Amazon Redshift は 
ID 値を作成するときにいくつかの値をスキップします。
ID 値は一意ですが、順序はソースファイルの順序と一致しない場合があります。 << ★注目

3)デフォルト IDENTITY について

* これって必要???
 => 以下の公式サイトの記述を見ると、使いづらそう。。。

GENERATED BY DEFAULT AS IDENTITY (seed, step)

デフォルトの identity 列については、次のことに注意してください。

* デフォルトの identity 列は NOT NULL です。NULL は挿入できません。
* 生成された値をデフォルトの identity 列に挿入するには、キーワード DEFAULT を使用します。
~~~~~~~
INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
~~~~~~~

* デフォルトの identity 列の値をオーバーライドしても、次に生成される値には影響しません。
* ALTER TABLE ADD COLUMN ステートメントでデフォルトの identity 列を追加することはできません。
* ALTER TABLE APPEND ステートメントを使用して、デフォルトの IDENTITY 列を追加できます。

【3】サンプル

-- テーブル定義
CREATE TABLE demo_user (
  user_id BIGINT IDENTITY(1,1) NOT NULL,
  user_name VARCHAR(50) NOT NULL,
  remarks VARCHAR(200)
);

-- データ挿入
INSERT INTO demo_user (user_name, remarks) VALUES ('Mike', 'Hello world');
INSERT INTO demo_user (user_name, remarks) VALUES ('Tom', 'Hi!!');

-- データ確認
SELECT * FROM demo_user LIMIT 10;

参考文献

https://dev.classmethod.jp/articles/amazon-redshift-identity-feature-dont-execute-perfectly/
https://dev.classmethod.jp/articles/amazon-redshift-auto-increment-by-identity-option/
https://dwgeek.com/what-are-redshift-sequence-alternative-example.html/

関連記事

Amazon Redshift ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/22/002139
Amazon Redshift ~ 他DB・サービスとの違い ~
https://dk521123.hatenablog.com/entry/2021/08/29/000000
自動ID付与 ~ SERIAL / BIGSERIAL / SMALLSERIAL ~
https://dk521123.hatenablog.com/entry/2021/08/10/000000