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

CREATE SEQUENCE rid_seq;
ALTER TABLE test ADD COLUMN rid INTEGER;
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq');

我要在其中插入序列的表是另一个查询的输出。我不知道在此初始查询期间添加序列还是在执行查询后将序列添加到表是否更有意义。

最佳答案

在添加新列时设置默认值:

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');

更改现有列的默认值不会更改现有数据,因为数据库无法知道应更改哪些值。列值上没有“此列具有默认值”标志,只有默认值(由于未指定其他内容,所以最初为NULL)和当前值(也为NULL),但是可以通过这种方式来区分“NULL”因为它是默认值”和“NULL,因为它已显式设置为NULL”。因此,分两个步骤进行操作时:
  • 添加列。
  • 更改默认值。

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

    顺便说一句,您可能也希望该列上的NOT NULL:
    create sequence rid_seq;
    alter table test add column rid integer not null default nextval('rid_seq');
    

    而且,如a_horse_with_no_name所述,如果仅打算将rid_seq用于test.rid列,则可能需要将set its owner column转换为test.rid,以便在删除该列时将其删除:
    alter sequence rid_seq owned by test.rid;
    

    关于sql - 在现有表上创建序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9457799/

    10-15 19:46