首页 文章

将varchar字段的类型更改为整数:“不能自动转换为整数”

提问于
浏览
128

我有一个小表,某个字段包含类型“ character varying ". I'm trying to change it to " Integer ”,但它给出了一个错误,即无法进行转换 .

有没有办法绕过这个或者我应该创建另一个表并使用查询将记录带入其中 .

该字段仅包含整数值 .

7 回答

  • 0

    如果你不小心或没有混合整数与文本数据,你应该首先执行以下更新命令(如果不是上面的alter table将失败):

    UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
    
  • 3

    如果您正在开发环境(或 生产环境 环境,它可能是备份您的数据),那么首先清除数据库字段中的数据或将值设置为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;

    我认为它会对你有所帮助 .

  • 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)'
    

    以上将模仿您从其他数据库适配器知道的内容 . 如果您有非数字数据,结果可能是意外的(但毕竟您将转换为整数) .

  • 206

    textvarcharinteger 没有隐式(自动)强制转换(即,您无法将 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 中运行,那么从错误消息中可以看出这一点,但是它显示了完整的错误 . 如果我在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迁移,但根本原因是相同的,答案适用 .

  • 0

    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.
    

    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)'
    

    或试试这个:

    change_column :table_name, :column_name, :integer, using: 'column_name::integer'
    

    如果您有兴趣了解有关此主题的更多信息,请阅读以下文章:https://kolosek.com/rails-change-database-column

  • 65

    我遇到了同样的问题 . 比我意识到我有一个我试图改变的列的默认字符串值 . 删除默认值使错误消失:)

相关问题