更改列数据类型Postgres

时间:2013-10-24 07:41:08

标签: postgresql postgresql-9.1

嘿,我刚刚开始研究PostgreSQL,我想知道如何更改列的数据类型,我尝试了以下命令:

alter table tableName alter column columnName type timestamp with time zone;

但是我收到以下消息:

 column "columnName" cannot be cast to type timestamp with time zone

当前列的数据类型是int,我想将其更改为时间戳

4 个答案:

答案 0 :(得分:2)

Postgres不知道如何将int转换为时间戳。有几种情况,通常它们的起始日期不同。

  1. 创建带时间戳的临时列
  2. 使用您自己的翻译更新表并将数据从旧列复制到临时列
  3. 删除旧列
  4. 重命名临时列。
  5. 如果您查看文档,您将找到一行语法,其中包含如何转换unix时间整数类型的示例:

    ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]
    

答案 1 :(得分:2)

Postgres不允许int类型列直接更改为时区。要实现此目的,您必须先将列类型更改为varchar,然后将其更改为时区。

alter table tableName alter column columnName type varchar(64);

alter table tableName alter column columnName type timestamp with time zone;

答案 2 :(得分:1)

使用USING子句有更好的方法。像这样:

ALTER TABLE tableName 
ALTER columnName type TIMESTAMP WITH TIME ZONE 
USING to_timestamp(columnName) AT TIME ZONE 'America/New_York';

答案 3 :(得分:0)

我通过以下方式实现了从时间戳到带时区的时间戳:

ALTER TABLE tableName ALTER COLUMN columnName SET DATA TYPE timestamp with time zone;

但如果是从时间戳到int或bigint的,则可能需要这样做:

ALTER TABLE tableName ALTER COLUMN columnName SET DATA TYPE int8 USING columnName::bigint