数据保持不变时更改列数据类型而无需重写

dav*_*tgq 2 postgresql datatypes alter-table

例如:

  • timestamp(tz)int8
  • dateint4
  • jsontext

原始数据不变,唯一的区别是数据的处理方式。因此,应该可以干净且即时地来回更改。

  1. 我如何检查是否确实如此?

  2. 如果不是这种情况(表格被重写),我如何在不重写的情况下做到这一点?

Lau*_*lbe 8

就像文档说的:

[...] 更改现有列的类型将需要重写整个表及其索引。作为一个例外,当更改现有列的类型时,如果USING子句不更改列内容并且旧类型是二进制强制转换为新类型或新类型上的不受约束的域,则不需要重写表;但仍必须重建受影响列上的任何索引。

所以关键是类型转换是二进制可强制转换的,换句话说,您需要在这些类型之间进行类型转换,即定义的类型WITHOUT FUNCTION

对于您在问题中提到的数据类型,情况并非如此,但如果您是超级用户,则可以创建这样的演员表,然后将其用于ALTER TABLE

CREATE CAST (date AS int4) WITHOUT FUNCTION;
ALTER TABLE mytable ALTER datecol TYPE int4 USING (datecol::int4);
DROP CAST (date AS int4);
Run Code Online (Sandbox Code Playgroud)

当然,您必须了解 的内部表示date才能有意义。

完成后删除强制转换是个好主意,因为在 PostgreSQL 中添加类型转换很容易导致类型解析过程中出现歧义,从而导致错误。