如果我们有一个 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;
文档暗示将会有自动转换,所以我们假设结果是相同的,但是有什么细微的差别吗?
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;
施放目标 | castfunc | castcontext | 铸造方法 | |
---|---|---|---|---|
bigint | pg_catalog.int8 | f |
castcontext char
指示可以在哪些上下文中调用强制转换。e
表示仅作为显式强制转换(使用 CAST 或 :: 语法)。意味着隐式分配给目标列,以及显式分配。a
i
表示在表达式中隐式表示,以及其他情况。