【问题标题】:Change column type from character varying to timestamp without time zone in PostgreSQL在 PostgreSQL 中将列类型从字符变化更改为没有时区的时间戳
【发布时间】:2012-11-14 04:01:40
【问题描述】:

在 Rails 中,我创建了一个名为 open_time 的字符串列,但后来我意识到我应该使用 datetime 类型。我做了

change_column :polls, :open_time, :datetime

但它说:

PG::Error: ERROR:  column "open_time" cannot be cast to type timestamp without time zone
: ALTER TABLE "polls" ALTER COLUMN "open_time" TYPE timestamp

如果我只是删除字符串列并添加新的日期时间列,我将丢失存储在字符串列中的数据。或者,在 PostgreSQL 中我添加列:

 ALTER TABLE polls ADD COLUMN published_time timestamp;

然后我尝试从字符串列中获取数据,例如:

UPDATE polls SET published_time = strToTimeStamp(open_time);

所以我的问题是,有没有什么函数可以用作strToTimeStamp,可以将字符变化类型转换为没有时区类型的时间戳?

【问题讨论】:

标签: ruby-on-rails-3 postgresql datetime types


【解决方案1】:

.. 有没有我可以用作 strToTimeStamp 的函数可以转换 将字符类型更改为没有时区类型的时间戳?

使用to_timestamp()就地改变列的数据类型。

ALTER TABLE tbl ALTER COLUMN col TYPE timestamp
USING to_timestamp(col, '<your pattern here>');

更多类似的问题:
Alter character field to date
Cast varchar type to date

【讨论】:

    【解决方案2】:

    不要以为你能做到,因为它受到数据库能力的限制。这个想法是这样做的:

    • 创建了一个不同名称的新列
    • 每行数据转换后复制列内容
    • 删除原来的col
    • 将新列重命名为原始列名

    这些步骤可以放在同一个迁移文件中,并将它们保存在一个事务中以防万一。

    【讨论】:

    • 没错,使用 DB 功能可以做到这一点,但它是关于使用 rails 的。即使我们可以在 Rails 迁移中使用原始 SQL 来更改数据库列,但不知何故,除非我们清楚地了解项目专注于某个数据库,否则这不是一个好习惯。
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2021-12-12
    • 2019-11-08
    • 2013-08-17
    • 1970-01-01
    • 2021-11-19
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多