我有一张小桌子,某个字段包含“ 字符变化 ”类型。我正在尝试将其更改为“ 整数 ”,但它给出了一个错误,即无法进行转换。
有没有办法解决这个问题,或者我应该创建另一个表并使用查询将记录带入其中。
该字段仅包含整数值。
没有从text或varchar到的隐式(自动)强制转换integer(即,您不能将 a 传递varchar给期望的函数integer或将varchar字段分配给一个),因此您必须使用ALTER TABLE … ALTER COLUMN … TYPEinteger指定显式强制转换。 .. 使用:
text
varchar
integer
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 上测试它会发生以下情况:
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链接。
USING
如果错误仍然发生,那么它可能与列值无关,但此列或列默认值的索引可能无法进行类型转换。需要在 ALTER COLUMN 之前删除索引并在之后重新创建索引。应适当更改默认值。