PostgreSQL类型转换为serial在创建新字段时不起作用



上下文

我想创建一个PostgreSQLMATERIALIZED VIEW,其中有一个动态创建的序列,但类型转换为SERIAL似乎不起作用(实际上,即使我放弃了创建视图的部分,如果我只使用内部SELECT语句,它也不起作用(:

CREATE MATERIALIZED VIEW schema.view_m AS (
SELECT
1::SERIAL AS id,
2::INTEGER as user_id 
)

如果我用INTEGER替换SERIAL,它是有效的,所以我想它不与SERIAL一起工作是有一些原因的。

我的需要是将这个id字段设置为一个真正的id(我的意思是与它相关的序列,唯一的,而不是null,等等(:

CREATE MATERIALIZED VIEW schema.view_m AS (
SELECT
-- obviousely replace "__type__cast__goes__here__" by the right statement here:
1::__type__cast__goes__here__ AS id, 
2::INTEGER as user_id 
)

与此类似,但适用于PostgreSQL。

问题

你知道这背后的技术原因是什么吗?

我使用的是PostgreSQL 10.12。

使用intserial并不是真正的类型。这是一种表示给定类型(int(正在自动生成的方式。当您定义外键关系时,这一点很明显。外键的类型需要与主键匹配,但int将用于引用serial

在Postgres10+中,解决方案是避免serial——出于其他原因,也建议这样做。新的语法使这一点更加清晰:

id int primary key generated always as identity

自动生成与类型名称是分开的。

最新更新