1. ホーム
  2. postgresql

[解決済み] varcharフィールドの型をintegerに変更する。"自動的にinteger型にキャストすることはできません"

2022-04-15 01:06:55

質問

小さなテーブルがあり、あるフィールドに " という型があります。 文字が変化する となります。これを".に変更しようとしています。 整数 "ですが、キャスティングができないというエラーが出ます。

これを回避する方法はありますか?それとも、別のテーブルを作成して、クエリを使用してレコードをそこに持ってくるべきですか?

このフィールドには整数値しか含まれません。

解決方法は?

からの暗黙の(自動的な)キャストは存在しません。 text または varchar から integer (を渡すことはできません(つまり varchar を期待する関数に integer を割り当てるか varchar フィールドを integer を使用した明示的なキャストを指定する必要があります。 テーブルを変更 ... 列を変更する ... TYPE ... 使用 :

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の前にインデックスを削除し、ALTER COLUMNの後にインデックスを再作成する必要があります。デフォルト値は適切に変更する必要があります。