web-dev-qa-db-ja.com

偶数のRedshift psql自動インクリメント

以下のように自動インクリメント列を持つテーブルを作成しようとしています。 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のドキュメントはまだ見ていません。どんな提案も大歓迎です!

14
peipei

次のようにIDを設定する必要があります。

id INT IDENTITY(0,1)

ソース: http://docs.aws.Amazon.com/redshift/latest/dg/r_CREATE_TABLE_examples.html

また、IDを0にリセットすることはできません。テーブルを削除して、再度作成する必要があります。

11
Jorge

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  |
5
Andrew Fogg

この問題は、AWSフォーラムで詳細に議論されています。

https://forums.aws.Amazon.com/message.jspa?messageID=623201

AWSからの回答。

あなたの質問に対する短い答えは、シードとステップです。COPYで並列処理とCOMPUPDATEオプションの両方を無効にした場合にのみ有効です。並列処理は、単一のファイルからデータを読み込む場合にのみ無効になります。これは、通常はお勧めしません。したがって、ほとんどのユーザーにとってはありそうもないシナリオになります。

ID値を行に割り当てる際に単一の競合ポイントがないことを保証するために、並列処理は物事に影響を与えます。結果として、値の割り当てにギャップが生じます。並列処理が無効になっている場合、ロードは連続して行われるため、異なるID値を並列に割り当てることには問題がありません。

COMPUPDATEが影響を与えるのは、COMPUPDATEを有効にすると、COPYが実際にデータに対して2つのパスを作成するためです。最初のパスでは、内部的にID値が増分され、その結果、初期値は予想よりも大きな値で始まります。

これを反映するようにドキュメントを更新します。

また、IDENTITY列では、複数のノードがこのような影響を与えるようです。本質的には、保証された一意のIDのみを提供できます。

3
user1741851