sql >> データベース >  >> RDS >> PostgreSQL

varcharフィールドの型を整数に変更:整数型に自動的にキャストできません

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



    1. SQLトレースと拡張イベントの「オブザーバーオーバーヘッド」の測定

    2. SQLServerでNULL=NULLがfalseと評価されるのはなぜですか

    3. SQLクエリの実行順序

    4. オラクル-どのステートメントをコミットする必要がありますか?