からtext
またはvarchar
への暗黙の(自動)キャストinteger
はありません(つまり、フィールドをvarchar
予期する関数に渡すinteger
ことも、varchar
フィールドをフィールドに割り当てることinteger
もできません)。したがって、ALTER TABLE ... ALTER COLUMN ... 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);
変換前に空白を削除します。
これは、コマンドがで実行された場合のエラーメッセージから明らかですが、PgAdmin psql
-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
USING
リンクを追加してくれて@muistooshortに感謝します。
こちらもご覧ください この関連質問。それはRailsの移行に関するものですが、根本的な原因は同じであり、答えが当てはまります。
それでもエラーが発生する場合は、列の値と関係がない可能性がありますが、この列または列のデフォルト値に対するインデックスは型キャストに失敗する可能性があります。インデックスは、ALTER COLUMNの前に削除し、後で再作成する必要があります。デフォルト値は適切に変更する必要があります。