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