我有一张小桌子,并且某个字段包含“ 字符变化 ” 类型。我正在尝试将其更改为“ Integer ”,但它给出了无法进行强制转换的错误。
有没有解决的办法,还是应该只创建另一个表并使用查询将记录带入其中。
该字段仅包含整数值。
SQL error: ERROR: column "MID" cannot be cast to type integer
SELECT
列表,而不依赖于列序位置。也就是说,答案中给出的方法将保留列的位置。
我有一张小桌子,并且某个字段包含“ 字符变化 ” 类型。我正在尝试将其更改为“ Integer ”,但它给出了无法进行强制转换的错误。
有没有解决的办法,还是应该只创建另一个表并使用查询将记录带入其中。
该字段仅包含整数值。
SQL error: ERROR: column "MID" cannot be cast to type integer
SELECT
列表,而不依赖于列序位置。也就是说,答案中给出的方法将保留列的位置。
Answers:
没有隐含的(自动)从铸铁text
或varchar
到integer
(即你不能传递varchar
给函数期望integer
或分配varchar
领域的integer
一个),所以你必须指定使用显式类型转换ALTER TABLE ... ALTER COLUMN ...类型。 ..使用:
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可能没有向您显示完整的错误。如果psql
在PostgreSQL 9.2上进行测试,会发生以下情况:
=> 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
链接。
参见这个相关问题 ; 这是关于Rails迁移的,但根本原因是相同的,答案也适用。
如果错误仍然存在,则可能与列值无关,但是此列或列默认值上的索引可能无法进行类型转换。索引需要在ALTER COLUMN之前删除,并在之后重新创建。默认值应适当更改。
psql
它变得越来越快。我写了一点关于pgAdmin的可用性咆哮与问候备份和恢复前一阵子:blog.ringerc.id.au/2012/05/...
这对我有用。
将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)'
您可以这样做:
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
试试这个,它肯定会起作用。
在编写Rails迁移以将字符串列转换为整数时,您通常会说:
change_column :table_name, :column_name, :integer
但是,PostgreSQL将抱怨:
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)'
上面的内容将模仿您从其他数据库适配器知道的内容。如果您有非数字数据,结果可能会出乎意料(毕竟您要转换为整数)。
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
错误发生
如果您不小心将整数与文本数据混合在一起,则应首先在以下update命令下执行(如果不在以上,则alter table将失败):
UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
regexp_replace(col_name, '[^0-9.]','','g')
不需要的字符和空格,最好使用类似的方法。你需要一些更复杂一点,如果你想保留NaN
和Inf
和10E42
科学记数法,虽然。
如果您在开发环境中工作(或用于生产环境,则可能会备份您的数据),那么首先要清除DB字段中的数据或将值设置为0。
UPDATE table_mame SET field_name= 0;
之后,运行以下查询,并在成功运行查询之后,运行到schemamigration,然后运行迁移脚本。
ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0) USING field_name::numeric;
我认为它将为您提供帮助。
我遇到过同样的问题。我开始重置列的默认值。
change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false