【问题标题】:How to change the auto numbering id field to serial type in PostgreSQL如何在 PostgreSQL 中将自动编号 id 字段更改为序列类型
【发布时间】:2014-08-01 13:47:31
【问题描述】:

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

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 的信息,因此我希望将所有现有的自动编号字段更改为串行。 怎么做?


我试过了

alter table company alter column companyid type serial 

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

【问题讨论】:

标签: postgresql autonumber


【解决方案1】:

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

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

alter sequence seq_gcompany_id owned by company.companyid;

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

【讨论】:

  • 确定一个问题,同时运行得到ERROR: sequence must have same owner as table it is linked to
  • @keet:这很清楚不是吗?您显然使用与表不同的所有者创建了序列。可能是使用错误的用户运行脚本的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
相关资源
最近更新 更多