创建新字段时,PostgreSQL类型转换为串行不起作用 上下文
我想创建一个序列,但类型转换为实际上似乎不起作用,即使我删除创建视图的零件,并且如果我只使用内部SELECT语句,它也不起作用:创建新字段时,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,我的意思是与它关联的序列
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语句中