Redshift psql自动增加偶数

pei*_*pei 14 sql amazon-redshift

我正在尝试创建一个带有自动增量列的表,如下所示.由于Redshift psql不支持SERIAL,我不得不使用IDENTITY数据类型:

IDENTITY(seed,step)
指定该列是IDENTITY列的子句.IDENTITY列包含唯一的自动生成值.这些值以指定为seed的值开始,并以指定为step的数字递增.IDENTITY列的数据类型必须是INT或BIGINT

我的create table语句如下所示:

CREATE TABLE my_table(
        id INT IDENTITY(1,1),
        name CHARACTER VARYING(255) NOT NULL,
        PRIMARY KEY( id ) 
);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试插入数据时my_table,行仅在偶数上增加,如下所示:

 id | name | 
----+------+
  2 | anna |
  4 | tom  |
  6 | adam |
  8 | bob  |
 10 | rob  |
Run Code Online (Sandbox Code Playgroud)

我的插入语句如下所示:

INSERT INTO my_table ( name ) 
VALUES ( 'anna' ), ('tom') , ('adam') , ('bob') , ('rob' );
Run Code Online (Sandbox Code Playgroud)

我也很难将id列重新开始1.有SERIAL数据类型的解决方案,但我还没有看到任何文档IDENTITY.我们欢迎所有的建议!

Jor*_*rge 10

您必须按如下方式设置您的身份:

id INT IDENTITY(0,1)
Run Code Online (Sandbox Code Playgroud)

资料来源:http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_examples.html

并且您无法将id重置为0.您必须删除该表并再次创建它.


小智 6

AWS 论坛详细讨论了这个问题。

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

来自AWS的答案。

对您问题的简短回答是,仅当您在副本中禁用并行性和 COMPUPDATE 选项时,才会尊重种子和步骤。当且仅当您从单个文件加载数据时,并行性才会被禁用,这是我们通常不建议的,因此对于大多数用户来说不太可能出现这种情况。

并行性会影响事物,因为为了确保在将标识值分配给行时不存在单点争用,最终会在值分配中出现间隙。禁用并行性时,负载会串行发生,因此并行分配不同的 id 值不会出现问题。

COMPUPDATE 影响事物的原因是,当启用它时,COPY 实际上会对您的数据进行 2 次传递。在第一次传递期间,它会在内部递增标识值,因此,您的初始值开始时的值比您预期的要大。

我们将更新文档以反映这一点。

此外,多个节点似乎也会对 IDENTITY 列造成这种影响。本质上它只能为您提供有保证的唯一ID。


And*_*ogg 5

将您的seed值设置为1并将您的step值设置为1

创建表

CREATE table my_table(
    id bigint identity(1, 1),
    name varchar(100),
    primary key(id));
Run Code Online (Sandbox Code Playgroud)

插入行

INSERT INTO organization ( name ) 
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');
Run Code Online (Sandbox Code Playgroud)

结果

 id | name | 
----+------+
  1 | anna |
  2 | tom  |
  3 | adam |
  4 | bob  |
  5 | rob  |
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果您将seed值设置为0并且将step值设置为 ,1那么整数将以 的步长增加2

创建表

CREATE table my_table(
    id bigint identity(0, 1),
    name varchar(100),
    primary key(id));
Run Code Online (Sandbox Code Playgroud)

插入行

INSERT INTO organization ( name ) 
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');
Run Code Online (Sandbox Code Playgroud)

结果

 id | name | 
----+------+
  0 | anna |
  2 | tom  |
  4 | adam |
  6 | bob  |
  8 | rob  |
Run Code Online (Sandbox Code Playgroud)