如何在PostgreSQL中将自动编号id字段更改为串行类型

时间:2014-08-01 05:11:57

标签: postgresql autonumber

我有一个从MSSQL迁移到PostgreSQL(9.2)的数据库。
这个数据库有100多个表,这些表有自动编号字段(PRIMARY KEY字段),下面给出的是一个表的例子

CREATE TABLE company
(
  companyid integer NOT NULL DEFAULT nextval('seq_company_id'::regclass),
  company character varying(100),
  add1 character varying(100),
  add2 character varying(100),
  add3 character varying(100),
  phoneoff character varying(30),
  phoneres character varying(30)
  CONSTRAINT gcompany_pkey PRIMARY KEY (companyid)
)


样本数据

 INSERT INTO company (company, add1, add2, add3, phoneoff, phoneres) VALUES   
 ('company1','add1','add2','add3','00055544','7788848');
 INSERT INTO company (company, add1, add2, add3, phoneoff, phoneres) VALUES  
 ('company2','add9','add5','add2','00088844','7458844');
 INSERT INTO company (company, add1, add2, add3, phoneoff, phoneres) VALUES 
 ('company5','add5','add8','add7','00099944','2218844');

及以下是此表的sequence

CREATE SEQUENCE seq_company_id
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 9223372036854775807
 START 1
 CACHE 1;
ALTER TABLE seq_company_id
OWNER TO postgres;

在阅读PostgreSQL文档时我读到了Serial Types所以我希望将所有现有的自动编号字段更改为serial。 怎么做?


我试过了

alter table company alter column companyid type serial 

 ERROR:  type "serial" does not exist
     ********** Error **********

1 个答案:

答案 0 :(得分:1)

确实没有数据类型serial。它只是从序列填充的默认值的简写表示法(有关详细信息,请参阅the manual),基本上就是您现在所拥有的。

您的设置与定义为serial的列之间的唯一区别是序列和列之间存在链接,您也可以手动定义:

alter sequence seq_gcompany_id owned by company.companyid;

使用该链接,您无法再将列与最初定义为serial的列区分开来。此更改的作用是,如果删除使用它的表(或列),则会自动删除序列。