将列的数据类型更改为serial

125*_*748 32 sql postgresql

在pgsql中,有没有办法获得一个包含多个值的表,并选择其中一个(比如,other_id),找出它的最高值,并使表中放入的每个新条目从该值开始递增.

我想这很容易有机会工作..

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL

____________________________________ 
ERROR:  type "serial" does not exist
Run Code Online (Sandbox Code Playgroud)

非常感谢任何见解!

Luc*_*cas 34

查看数据类型serial的 postgresql文档.串口只是空手而已.

CREATE TABLE tablename (
    colname SERIAL
);
Run Code Online (Sandbox Code Playgroud)

相当于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
Run Code Online (Sandbox Code Playgroud)


小智 20

发生这种情况是因为您只能在创建新表或向表中添加新列时使用串行数据类型。如果您尝试使用此数据类型更改现有表,则会出现错误。因为串行不是真正的数据类型,而只是较长查询的缩写或别名。

如果您想达到相同的效果,正如您期望在更改现有表时使用串行数据类型,您可以这样做:

CREATE SEQUENCE my_serial AS integer START 1 OWNED BY address.new_id;

ALTER TABLE address ALTER COLUMN new_id SET DEFAULT nextval('my_serial');
Run Code Online (Sandbox Code Playgroud)
  1. 查询的第一行创建您自己的名为my_serial的序列。该 语句连接着你的表的确切列新创建的序列。在您的情况下,表是地址,列是new_id。该START语句定义什么值这个顺序应该开始。

  2. 第二行使用新的默认值更改您的表,这将由之前创建的序列确定。

它将为您提供与您期望使用串行相同的结果。


leo*_*loy 17

快速浏览文档可以告诉您

smallserial,serial和bigserial 数据类型不是真正的类型, 而仅仅是创建唯一标识符列的标记方便

如果要使现有(整数)列作为"串行"工作,只需手动创建序列(名称是任意的),将其当前值设置为当前值的最大值(或更大address.new_id值)它作为address.new_id列的默认值.

要设置序列的值,请参见此处.

SELECT setval('address_new_id_seq', 10000);

这只是一个示例,使用您自己的序列名称(任意,您创建它),以及大于列的最大当前值的数字.


更新:正如Lucas的答案(应该是被接受的答案)所指出的那样,您还应该通过使用指定序列"属于"哪一列CREATE/ALTER SEQUENCE ... OWNED BY ...