■ はじめに
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