创建新字段时,PostgreSQL类型转换为串行不起作用 上下文

创建新字段时,PostgreSQL类型转换为串行不起作用 上下文,sql,postgresql,casting,Sql,Postgresql,Casting,我想创建一个序列,但类型转换为实际上似乎不起作用,即使我删除创建视图的零件,并且如果我只使用内部SELECT语句,它也不起作用: CREATE MATERIALIZED VIEW schema.view_m AS ( SELECT 1::SERIAL AS id, 2::INTEGER as user_id ) 如果我用整数替换SERIAL,它就工作了,所以我想这是它不能用SERIAL工作的原因 我的需要是动态地将这个id字段设置为一个真实的id,我的意思是与它关联的序列

我想创建一个序列,但类型转换为实际上似乎不起作用,即使我删除创建视图的零件,并且如果我只使用内部SELECT语句,它也不起作用:

CREATE MATERIALIZED VIEW schema.view_m AS (
  SELECT
    1::SERIAL AS id,
    2::INTEGER as user_id 
)
如果我用整数替换SERIAL,它就工作了,所以我想这是它不能用SERIAL工作的原因

我的需要是动态地将这个id字段设置为一个真实的id,我的意思是与它关联的序列,唯一的,非空的,等等:

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将用于表示串行

在Postgres 10+中,解决方案是避免串行-出于其他原因也建议这样做。新语法使这一点更加清晰:

id int primary key generated always as identity

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

太好了。有没有办法通过select语句中id的反向定义1::___;一次性创建这样的新字段?可能不可能吧?@s.k。我不知道你到底是什么意思。你可以使用一个序列,但是每次序列被引用时它都会被更新。你可以读取序列值而不增加它。你不能实时生成一个稳定的id。重建mview时,所有ID都会更改,因为它会从mview中完全删除所有行并重新插入新行。最好将这样一列添加到从中选择几何图形的表中,并将其包含在mview的SELECT语句中