上下文
我想创建一个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。
使用int
。serial
并不是真正的类型。这是一种表示给定类型(int
(正在自动生成的方式。当您定义外键关系时,这一点很明显。外键的类型需要与主键匹配,但int
将用于引用serial
。
在Postgres10+中,解决方案是避免serial
——出于其他原因,也建议这样做。新的语法使这一点更加清晰:
id int primary key generated always as identity
自动生成与类型名称是分开的。