postgres:从int4转换为int8,是否需要“使用”?

问题描述 投票:0回答:1

如果我们有一个 int4 的 sport_id 列,并且该表有很多现有的 sport_id 值但不包含空值,那么这两个语句是否相同?

alter table customer alter sport_id type int8;

ALTER TABLE customer ALTER COLUMN sport_id TYPE int8 USING sport_id::int8;

文档暗示将会有自动转换,所以我们假设结果是相同的,但是有什么细微的差别吗?

postgresql
1个回答
0
投票

这些之间没有区别。引用

ALTER TABLE
文档

SET DATA TYPE 

这种形式改变表的列的类型。通过重新分析最初提供的表达式,涉及该列的索引和简单表约束将自动转换为使用新的列类型。可选的 COLLATE 子句指定新列的排序规则;如果省略,则排序规则是新列类型的默认排序规则。可选的
USING
子句指定如何从旧列值计算新列值;如果省略,默认转换与从旧数据类型到新数据类型的赋值转换相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供 USING
 子句 

在这种情况下,您可以在

int4::int8

: 中找到隐式 
pg_cast
转换
select castsource::regtype ,casttarget::regtype ,castfunc::regproc ,castcontext ,castmethod from pg_cast where casttarget::regtype='int8'::regtype and castsource::regtype='int4'::regtype;


castsource整数我
施放目标 castfunc castcontext 铸造方法
bigint pg_catalog.int8 f
castcontext char

指示可以在哪些上下文中调用强制转换。
e
表示仅作为显式强制转换(使用 CAST 或 :: 语法)。
a
意味着隐式分配给目标列,以及显式分配。
i 表示在表达式中隐式表示,以及其他情况。

© www.soinside.com 2019 - 2024. All rights reserved.