将列的数据类型更改为serial

时间:2013-05-10 03:28:54

标签: sql postgresql

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

我认为这很容易让人有机会工作......

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL

____________________________________ 
ERROR:  type "serial" does not exist

非常感谢任何见解!

3 个答案:

答案 0 :(得分:29)

查看datatype serial的postgresql文档。串口只是空手而已。

CREATE TABLE tablename (
    colname SERIAL
);

相当于指定:

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;

答案 1 :(得分:14)

快速浏览docs会告诉您

  

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

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

要设置序列的值,请参阅here

address.new_id

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


更新:正如Lucas的回答(应该是被接受者)所指出的那样,您还应该使用SELECT setval('address_new_id_seq', 10000);

答案 2 :(得分:2)

之所以发生这种情况,是因为只有在创建新表或向表中添加新列时才可以使用 serial 数据类型。如果您尝试使用此数据类型更改现有表,则会收到错误消息。因为 serial 不是真正的数据类型,而只是更长的查询的缩写或别名。

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

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');
  1. 查询的第一行创建您自己的名称为 my_serial 的序列。 OWEND BY 语句将新创建的序列与表的确切列相连接。在您的确切情况下,表是 address ,列是 new_id START 语句定义此序列应从哪个值开始。

  2. 第二行使用新的默认值更改表格,该默认值将由先前创建的顺序决定。

它将为您带来与使用串行设备相同的结果。