【问题标题】:Alter a Column Data Type Postgres更改列数据类型 Postgres
【发布时间】:2013-10-24 07:41:07
【问题描述】:

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

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

但是我收到以下消息:

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

当前列的数据类型是int,我想改成timestamp

【问题讨论】:

    标签: postgresql postgresql-9.1


    【解决方案1】:

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

    1. 创建带有时间戳的临时列
    2. 使用您自己的翻译更新表并将数据从旧列复制到临时列
    3. 删除旧列
    4. 重命名临时列。

    如果您查看文档,您会发现一行语法以及如何转换 unix 时间整数类型的示例:

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

    【讨论】:

    • 来自文档的example 完美地涵盖了这个案例:ALTER TABLE foo ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
    • 只需在 USING 表达式中告诉 PostgreSQL 使用哪个时区
    • 谁能真正解释一下使用表达式的工作原理?我想更改禁止布尔列为空,但它不起作用,因为某些值已经为空。我想使用 using 表达式来改变它
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      有一个更好的方法来做到这一点,使用USING 子句。像这样:

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

      【讨论】:

        【解决方案4】:

        我通过时区实现了从时间戳到时间戳:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-21
          • 2021-01-15
          • 1970-01-01
          • 1970-01-01
          • 2012-03-19
          • 1970-01-01
          • 2018-11-22
          • 2014-03-05
          相关资源
          最近更新 更多