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。
将您的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)