如何将表列转换为另一种数据类型

时间:2010-05-21 11:50:17

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

我的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

2 个答案:

答案 0 :(得分:13)

听起来问题是你的表中有空字符串。您需要处理这些,可能是一个案例陈述,例如:

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

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

答案 1 :(得分:2)

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

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

之类的方式进行检查
  select columnB from table where not columnB ~ E'^[0-9]+$';

如果希望将空字符串转换为NULL整数,则先运行

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