【问题标题】:Creating a sequence on an existing table在现有表上创建序列
【发布时间】:2012-02-26 22:24:50
【问题描述】:

如何在表上创建一个序列,使其从 0 -> 最大值开始? 我已经尝试使用以下 SQL 代码,但它不会将任何值插入到我正在使用的表中:

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

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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    添加新列时设置默认值:

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

    更改现有列的默认值不会更改现有数据,因为数据库无法知道应该更改哪些值;列值上没有“此列具有默认值”标志,只有默认值(最初为 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');
    

    并且,正如a_horse_with_no_name 所指出的,如果您只打算将rid_seq 用于您的test.rid 列,那么您可能希望将set its owner column 转换为test.rid,以便在删除该列时删除该序列:

    alter sequence rid_seq owned by test.rid;
    

    【讨论】:

    • 您可能还想让该列成为序列的“所有者”,以便 PostgreSQL 知道它属于该列:alter sequence rid_sequence owner to test.rid
    • 是否可以在现有表中自定义序列值,如“REQ0001-REQ000N”?
    • @Angger 序列是数字的,所以不是真的。您可以通过连接两列或将字符串与独立序列连接来伪造它。
    • 你能给我举个例子吗? :D
    • @Angger No, search harder :)
    【解决方案2】:

    在 PostgreSQL 中:

    UPDATE your_table SET your_column = nextval('your_sequence')
    WHERE your_column IS NULL;
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 感谢 sn-p。当我尝试运行它时遇到语法错误:at or near @。我不熟悉 Postgreqsl 中的变量定义,所以我不确定是否有明显的地方需要更改。
      • (1) 这看起来像 SQL Server 或可能是 MySQL 语法,它在 PostgreSQL 中不起作用。 (2) 这会在添加新行时造成一些麻烦,因为您没有使用序列中的值,即使您已经将其用于 @ 987654324@.
      • 很好,mu is too short,关于不使用序列值。是的,我非常擅长编写 MS SQL Server 代码(我会用不同的方式解决这个问题),并且根本不熟悉 PostgreSQL。我试图提出的观点是定义约束和应用它之间的区别,赞成的答案比我解释得更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2015-08-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多