当我尝试通过alter command ...
更改表中列的数据类型时alter table temp alter column id type bigserial;
我得到了
ERROR: type "bigserial" does not exist
如何将数据类型从bigint更改为bigserial?
答案 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)
ALTER
从BIGINTEGER
到BIGSERIAL
的列,以使其自动增加将无效。 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)
听起来像是很多专业人士在讨论这个问题……如果原始表确实有数据,那么真正解决此难题的办法就是首先正确地设计数据库。但是,在这种情况下,更改列规则(类型)将需要对新范式对该列进行完整性验证。而且,不要忘记,在任何地方对该列进行了操作(添加/更新)之后,都需要对其进行调查。
如果这是一个新表,那么好吧,很简单:删除列并重新添加新列(请为您处理顺序)。再次,设计,设计,设计。
我认为我们都对此犯规。