ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0)USING field_name :: numeric;
我认为它会对你有所帮助 .
7
试试这个,它肯定会起作用 .
在编写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)'
=> 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
PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
ch to to
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
8
你可以这样做:
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
7 回答
如果你不小心或没有混合整数与文本数据,你应该首先执行以下更新命令(如果不是上面的alter table将失败):
如果您正在开发环境(或 生产环境 环境,它可能是备份您的数据),那么首先清除数据库字段中的数据或将值设置为0 .
UPDATE table_mame SET field_name = 0;
之后运行以下查询并在成功运行查询之后,运行schemamigration,之后运行migrate脚本 .
ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0)USING field_name :: numeric;
我认为它会对你有所帮助 .
试试这个,它肯定会起作用 .
在编写Rails迁移以将字符串列转换为整数时,您通常会说:
但是,PostgreSQL会抱怨:
“提示”基本上告诉您需要确认是否要发生这种情况,以及如何转换数据 . 在您的迁移中说出这一点:
以上将模仿您从其他数据库适配器知道的内容 . 如果您有非数字数据,结果可能是意外的(但毕竟您将转换为整数) .
从
text
或varchar
到integer
没有隐式(自动)强制转换(即,您无法将varchar
传递给期望integer
或将varchar
字段分配给integer
的函数),因此您必须使用ALTER TABLE ... ALTER COLUMN ... TYPE ... USING指定显式强制转换:请注意,您的文本字段中可能包含空格;在这种情况下,使用:
在转换之前剥去空白区域 .
如果命令在
psql
中运行,那么从错误消息中可以看出这一点,但是它显示了完整的错误 . 如果我在PostgreSQL 9.2上的psql
中测试它会发生什么:感谢@muistooshort添加了
USING
链接 .另见this related question;它是关于Rails迁移,但根本原因是相同的,答案适用 .
this为我工作 .
将varchar列更改为int
拿到:
ch to to
你可以这样做:
或试试这个:
如果您有兴趣了解有关此主题的更多信息,请阅读以下文章:https://kolosek.com/rails-change-database-column
我遇到了同样的问题 . 比我意识到我有一个我试图改变的列的默认字符串值 . 删除默认值使错误消失:)