我有一个很小的表,其中的某个字段包含类型"character varying“。我试图将其更改为"Integer“,但它给出了一个错误,即不能进行类型转换。
有没有办法解决这个问题,或者我应该创建另一个表,并使用查询将记录带入其中。
该字段仅包含整数值。
发布于 2012-11-01 11:47:21
不存在从text
或varchar
到integer
的隐式(自动)转换(即,不能将varchar
传递给需要integer
的函数或将varchar
字段分配给integer
字段),因此必须使用ALTER TABLE ... ALTER COLUMN ... TYPE ... USING指定显式转换
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
请注意,您的文本字段中可能有空格;在这种情况下,请使用:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
若要在转换前剥离空白,请执行以下操作。
如果命令是在psql
中运行的,从错误消息中可以明显看出这一点,但是PgAdmin-III可能没有显示完整的错误。如果我在PostgreSQL 9.2上的psql
中测试它,结果如下:
=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42 ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR: column "x" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE
感谢@muistooshort添加了USING
链接。
另请参阅this related question;它是关于Rails迁移的,但根本原因是相同的,答案也是适用的。
如果错误仍然出现,则可能与列值无关,但此列或列默认值上的索引可能无法进行类型转换。索引需要在ALTER COLUMN之前删除,在ALTER COLUMN之后重新创建。应适当更改默认值。
发布于 2014-07-30 16:35:04
this为我工作。
将varchar列更改为int
change_column :table_name, :column_name, :integer
得到:
PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
已更改为
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
发布于 2018-05-09 16:55:10
你可以像这样做:
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
或者试试这个:
change_column :table_name, :column_name, :integer, using: 'column_name::integer'
如果您有兴趣找到有关此主题的更多信息,请阅读本文:https://kolosek.com/rails-change-database-column
https://stackoverflow.com/questions/13170570
复制相似问题