PostgreSQL列类型转换形式bigint到bigserial

时间:2015-08-12 12:39:30

标签: sql database postgresql persistence

当我尝试通过alter command ...

更改表中列的数据类型时
alter table temp alter column id type bigserial;

我得到了

ERROR:  type "bigserial" does not exist

如何将数据类型从bigint更改为bigserial?

4 个答案:

答案 0 :(得分:20)

正如documentation中所述,SERIAL不是数据类型,而是其他命令集合的快捷方式。

因此,虽然您只需通过更改类型即可对其进行更改,但您可以通过自己运行其他命令来实现相同的效果:

CREATE SEQUENCE temp_id_seq;
ALTER TABLE temp ALTER COLUMN id SET NOT NULL;
ALTER TABLE temp ALTER COLUMN id SET DEFAULT nextval('temp_id_seq');
ALTER SEQUENCE temp_id_seq OWNED BY temp.id;

如果删除表/列,则更改所有者将确保删除序列。它还会在pg_get_serial_sequence()函数中为您提供预期的行为。

必须坚持tablename_columnname_seq命名约定,以说服像pgAdmin这样的工具将此列类型报告为BIGSERIAL。请注意,即使该列最初被声明为SERIAL类型,psql和pg_dump也将始终显示基础定义。

从Postgres 10开始,您还可以选择使用SQL标准identity column,它可以无形地处理所有这些,并且您可以轻松地将其添加到现有表中:

ALTER TABLE temp ALTER COLUMN id
  ADD GENERATED BY DEFAULT AS IDENTITY

答案 1 :(得分:6)

ALTERBIGINTEGERBIGSERIAL的列,以使其自动增加将无效。 BIGSERIAL is not a true type, it is a trick that automates PK and SEQUENCE creation

相反,您可以自己创建序列,然后将其指定为列的默认值:

CREATE SEQUENCE "YOURSCHEMA"."SEQNAME";

ALTER TABLE "YOURSCHEMA"."TABLENAME"
   ALTER COLUMN "COLUMNNAME" SET DEFAULT nextval('"YOURSCHEMA"."SEQNAME"'::regclass);
ALTER TABLE "YOURSCHEMA"."TABLENAME" ADD CONSTRAINT pk PRIMARY KEY ("COLUMNNAME");

答案 2 :(得分:2)

这是一个简单的解决方法:

ALTER TABLE table_name drop column column_name, add column column_name bigserial;

答案 3 :(得分:0)

听起来像是很多专业人士在讨论这个问题……如果原始表确实有数据,那么真正解决此难题的办法就是首先正确地设计数据库。但是,在这种情况下,更改列规则(类型)将需要对新范式对该列进行完整性验证。而且,不要忘记,在任何地方对该列进行了操作(添加/更新)之后,都需要对其进行调查。

如果这是一个新表,那么好吧,很简单:删除列并重新添加新列(请为您处理顺序)。再次,设计,设计,设计。

我认为我们都对此犯规。