在PostgreSQL中将列数据类型从Text更改为Integer

New*_*bie 12 sql postgresql casting

我使用以下查询将列的数据类型从文本更改为整数但获取错误:

 alter table a.attend alter column terminal TYPE INTEGER ;
Run Code Online (Sandbox Code Playgroud)

错误:列"终端"无法自动转换为整数类型

Viv*_* S. 26

create table test(id varchar );
insert into test values('1');
insert into test values('11');
insert into test values('12');

select * from test

 --Result--
 id
 character varying
--------------------------
 1
 11
 12
Run Code Online (Sandbox Code Playgroud)

您可以从上表中看到我使用了数据类型 - character varying用于id 列.但是,这是一个错误,因为我总是给integersid.所以varchar在这里使用是一种不好的做法.所以让我们尝试将列类型更改为integer.

ALTER TABLE test ALTER COLUMN id TYPE integer;
Run Code Online (Sandbox Code Playgroud)

但它返回:

错误:列"id"无法自动转换为类型整数SQL状态:42804提示:指定USING表达式以执行转换

这意味着我们不能简单地更改数据类型,因为列中已存在数据.由于数据类型为character varyingPostgres,因此我们只能输入整数,因此不能指望它为整数.所以现在,正如Postgres建议我们可以使用USING表达式将数据转换为整数.

ALTER TABLE test ALTER COLUMN id  TYPE integer USING (id::integer);
Run Code Online (Sandbox Code Playgroud)

有用.


所以你应该使用

alter table a.attend alter column terminal TYPE INTEGER  USING (terminal::integer) ;
Run Code Online (Sandbox Code Playgroud)

  • 这听起来很愚蠢,但不要忘记替换“USING (id::integer)”中的“id”。我不小心将其中一列变成了“id”列的副本。对我来说幸运的是,我只是在尝试,所以没有伤害也没有犯规:D (3认同)
  • 仅当源类型和目标类型之间没有定义隐式赋值转换时才需要`USING` 子句。详细信息[这里](http://stackoverflow.com/questions/10343383/rails-migrations-tried-to-change-the-type-of-column-from-string-to-integer/10343444#10343444)和[这里](http://stackoverflow.com/questions/21045909/generate-series-of-dates-using-date-type-as-input/21051215#21051215)。 (2认同)