以下のように自動インクリメント列を持つテーブルを作成しようとしています。 Redshift psqlはSERIALをサポートしていないため、 IDENTITYデータ型 を使用する必要がありました。
IDENTITY(シード、ステップ)
列がIDENTITY列であることを指定する句。 IDENTITY列には、一意の自動生成値が含まれています。これらの値は、シードとして指定された値で始まり、ステップとして指定された数だけ増加します。 IDENTITY列のデータ型はINTまたはBIGINTのいずれかである必要があります。`
私のcreate tableステートメントは次のようになります。
CREATE TABLE my_table(
id INT IDENTITY(1,1),
name CHARACTER VARYING(255) NOT NULL,
PRIMARY KEY( id )
);
ただし、my_table
にデータを挿入しようとすると、以下のように行が偶数でのみ増分します。
id | name |
----+------+
2 | anna |
4 | tom |
6 | adam |
8 | bob |
10 | rob |
私の挿入ステートメントは以下のようになります:
INSERT INTO my_table ( name )
VALUES ( 'anna' ), ('tom') , ('adam') , ('bob') , ('rob' );
Id列を最初の1に戻すことにも問題があります。SERIAL
データ型の解決策はありますが、IDENTITY
のドキュメントはまだ見ていません。どんな提案も大歓迎です!
次のようにIDを設定する必要があります。
id INT IDENTITY(0,1)
ソース: http://docs.aws.Amazon.com/redshift/latest/dg/r_CREATE_TABLE_examples.html
また、IDを0にリセットすることはできません。テーブルを削除して、再度作成する必要があります。
seed
値を1
に設定し、step
値を1
に設定します。
テーブルを作成
CREATE table my_table(
id bigint identity(1, 1),
name varchar(100),
primary key(id));
行を挿入
INSERT INTO organization ( name )
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');
結果
id | name |
----+------+
1 | anna |
2 | tom |
3 | adam |
4 | bob |
5 | rob |
何らかの理由で、seed
値を0
に設定し、step
値を1
に設定すると、整数は2
のステップで増加します。
テーブルを作成
CREATE table my_table(
id bigint identity(0, 1),
name varchar(100),
primary key(id));
行を挿入
INSERT INTO organization ( name )
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');
結果
id | name |
----+------+
0 | anna |
2 | tom |
4 | adam |
6 | bob |
8 | rob |
この問題は、AWSフォーラムで詳細に議論されています。
https://forums.aws.Amazon.com/message.jspa?messageID=623201
AWSからの回答。
あなたの質問に対する短い答えは、シードとステップです。COPYで並列処理とCOMPUPDATEオプションの両方を無効にした場合にのみ有効です。並列処理は、単一のファイルからデータを読み込む場合にのみ無効になります。これは、通常はお勧めしません。したがって、ほとんどのユーザーにとってはありそうもないシナリオになります。
ID値を行に割り当てる際に単一の競合ポイントがないことを保証するために、並列処理は物事に影響を与えます。結果として、値の割り当てにギャップが生じます。並列処理が無効になっている場合、ロードは連続して行われるため、異なるID値を並列に割り当てることには問題がありません。
COMPUPDATEが影響を与えるのは、COMPUPDATEを有効にすると、COPYが実際にデータに対して2つのパスを作成するためです。最初のパスでは、内部的にID値が増分され、その結果、初期値は予想よりも大きな値で始まります。
これを反映するようにドキュメントを更新します。
また、IDENTITY列では、複数のノードがこのような影響を与えるようです。本質的には、保証された一意のIDのみを提供できます。