【问题标题】:How to convert a table column to another data type如何将表列转换为另一种数据类型
【发布时间】:2010-05-21 11:50:17
【问题描述】:

我的 Postgres 数据库中有一个类型为 Varchar 的列,我的意思是整数......现在我想更改它们,不幸的是,这似乎不适用于我的 rails 迁移。

change_column :table1, :columnB, :integer

这似乎输出了这个 SQL:

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer

所以我尝试这样做:

execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)'

但是在这种情况下强制转换不起作用,因为某些列是空的...

有什么想法吗?

错误:

PGError: ERROR:  invalid input syntax for integer: ""
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)

Postgres v8.3

【问题讨论】:

  • 您使用的是哪个版本的 postgres?对我有用
  • 顺便说一句:迁移到底有什么问题?

标签: ruby-on-rails postgresql migration types alter-table


【解决方案1】:

听起来问题在于您的表中有空字符串。您需要处理这些问题,可能需要使用 case 语句,例如:

execute %{ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST(CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

更新:根据更新的问题完全重写。

【讨论】:

  • 我取出引号,并尝试使用合并但我只得到“PGError:错误:列“0”不存在”
【解决方案2】:

NULL 在这里应该不是问题。 告诉我们您的 postgresql 版本和错误消息。 此外,您为什么要引用标识符?请注意,未加引号的标识符将转换为小写(默认行为),因此您的查询中的“columnB”可能存在问题 - 它首先出现在引号中,在转换中未加引号。

更新:在将列转换为整数之前,您必须确保所有值都是可转换的。在这种情况下,这意味着 columnB 应该只包含数字(或 null)。 您可以通过类似的方式检查这一点

  select columnB from table where not columnB ~ E'^[0-9]+$';

如果要将空字符串转换为 NULL 整数,请先运行

  UPDATE table set  columnB = NULL WHERE columnB = '';

【讨论】:

  • 最新的 postgresql 版本是 8.4.4
  • 对不起,我的意思是 8.3 (postgresql83) ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2021-11-12
  • 2023-01-04
  • 2020-05-27
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多