在现有表上创建序列

djq*_*djq 26 sql postgresql

如何在表格上创建一个序列,使其从0 - >最大值?我尝试使用以下SQL代码,但它没有在我正在使用的表中插入任何值:

CREATE SEQUENCE rid_seq;
ALTER TABLE test ADD COLUMN rid INTEGER;
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq');
Run Code Online (Sandbox Code Playgroud)

我试图插入序列的表是另一个查询的输出.我无法弄清楚在初始查询期间添加序列是否更有意义,或者在执行查询后将序列添加到表中.

mu *_*ort 42

添加新列时设置默认值:

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');
Run Code Online (Sandbox Code Playgroud)

更改现有列的默认值不会更改现有数据,因为数据库无法知道应更改哪些值; 列值上没有"此列有默认值"标志,只有默认值(原来是NULL,因为你没有指定其他任何东西)和当前值(也是NULL)但方法告诉"NULL"之间的区别因为它是默认的"和"NULL,因为它被显式设置为NULL".所以,当你分两步完成时:

  1. 添加列.
  2. 更改默认值.

PostgreSQL不会将默认值应用于刚刚添加的列.但是,如果添加列并同时提供默认值,则PostgreSQL确实知道哪些行具有默认值(所有行),因此它可以在添加列时提供值.

顺便说一下,你可能也希望在该列上使用NOT NULL:

create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');
Run Code Online (Sandbox Code Playgroud)

并且,作为a_horse_with_no_name注释,如果您只打算rid_seq用于您的test.rid列,那么您可能希望将其所有者列设置为,test.rid以便在删除该列时删除该序列:

alter sequence rid_seq owned by test.rid;
Run Code Online (Sandbox Code Playgroud)

  • 您可能还希望将该列作为序列的"所有者",以便PostgreSQL知道它属于该列:`alter sequence rid_sequence owner to test.rid` (3认同)

Jas*_*ter -3

我对 postgresql 不太熟悉,所以我不熟悉“CREATE SEQUENCE”语句。不过,我认为您正确添加了列定义。但是,添加列不会自动插入现有行的数据。DEFAULT 约束用于新行。之后尝试添加类似的内容以填充现有行上的数据。

DECLARE @i Int
SET @i = 0
SET ROWCOUNT 1
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN
   UPDATE test SET rid = @i WHERE rid IS NULL
END
SET ROWCOUNT 0
Run Code Online (Sandbox Code Playgroud)