[postgresql] varchar 필드의 유형을 정수로 변경 : “정수 유형으로 자동으로 캐스트 할 수 없음”

작은 테이블이 있고 특정 필드에 ” character varying ” 유형이 있습니다 . ” 정수 ” 로 변경하려고하는데 캐스팅이 불가능하다는 오류가 발생합니다.

이 문제를 해결할 방법이 있습니까? 아니면 다른 테이블을 만들고 쿼리를 사용하여 레코드를 가져와야합니다.

이 필드에는 정수 값만 포함됩니다.



답변

에서 암시 (자동) 주조 없습니다 text또는 varchar으로는 integer(A를 전달할 수 없습니다 당신을 즉, 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);

변환하기 전에 공백을 제거합니다.

이 명령은에서 명령을 실행 한 경우 오류 메시지에서 분명 psql하지만 PgAdmin-III이 전체 오류를 표시하지 않을 수 있습니다. psqlPostgreSQL 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 전에 인덱스를 삭제 한 후 다시 작성해야합니다. 기본값은 적절히 변경해야합니다.


답변

이것은 나를 위해 일했습니다.

varchar 열을 int로 변경

change_column :table_name, :column_name, :integer

얻었다 :

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

에 물렸다

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'


답변

당신은 다음과 같이 할 수 있습니다 :

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

또는 이것을 시도하십시오 :

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

이 주제에 대해 더 자세히 알고 싶다면이 기사를 읽으십시오 : https://kolosek.com/rails-change-database-column


답변

이것을 시도하십시오, 그것은 확실히 작동합니다.

문자열 열을 정수로 변환하기 위해 Rails 마이그레이션을 작성할 때 일반적으로 다음과 같이 말합니다.

change_column :table_name, :column_name, :integer

그러나 PostgreSQL은 다음과 같이 불평합니다.

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

“힌트”는 기본적으로 이러한 상황이 발생했는지 확인하고 데이터 변환 방법을 확인해야 함을 나타냅니다. 마이그레이션에서 다음과 같이 말하십시오.

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

위의 내용은 다른 데이터베이스 어댑터에서 알고있는 내용과 유사합니다. 숫자가 아닌 데이터가있는 경우 결과가 예기치 않을 수 있습니다 (그러나 결국 정수로 변환하는 중임).


답변

나는 같은 문제를 겪었다. 내가 변경하려고하는 열의 기본 문자열 값이 있다는 것을 깨달았습니다. 기본값을 제거하면 오류가 사라졌습니다. 🙂


답변

실수로 또는 정수와 텍스트 데이터를 혼합하지 않은 경우 먼저 업데이트 명령 아래에서 실행해야합니다 (위의 경우는 테이블 변경이 실패합니다).

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');


답변

개발 환경에서 작업 중이거나 프로덕션 환경에서 데이터를 백업하는 경우 먼저 DB 필드에서 데이터를 지우거나 값을 0으로 설정하십시오.

UPDATE table_mame SET field_name= 0;

그 후 아래 쿼리를 실행하고 쿼리를 성공적으로 실행 한 후 schemamigration으로 이동 한 후 마이그레이션 스크립트를 실행하십시오.

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0) USING field_name::numeric;

나는 그것이 당신을 도울 것이라고 생각합니다.