[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이 전체 오류를 표시하지 않을 수 있습니다. 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 전에 인덱스를 삭제 한 후 다시 작성해야합니다. 기본값은 적절히 변경해야합니다.
답변
이것은 나를 위해 일했습니다.
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;
나는 그것이 당신을 도울 것이라고 생각합니다.