varchar 필드 유형을 정수로 변경합니다. "정수 유형으로 자동 캐스트할 수 없습니다."
작은 테이블이 있고 특정 필드에 "문자 변화" 유형이 포함되어 있습니다.정수로 변경하려고 하는데 캐스팅이 불가능하다는 오류가 발생합니다.
이 문제를 해결할 방법이 있습니까? 아니면 다른 테이블을 만들고 쿼리를 사용하여 레코드를 가져와야 합니까?
필드에는 정수 값만 포함됩니다.
암시적(자동) 캐스트는 없습니다.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
포스트그레에SQL 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
@muis 너무 짧아서 추가해 주셔서 감사합니다.USING
링크를 걸다
레일즈 마이그레이션에 관한 이 관련 질문도 참조하십시오. 그러나 기본 원인은 동일하며 답변이 적용됩니다.
오류가 계속 발생하면 열 값과 관련이 없지만 이 열 또는 열 기본값에 대한 인덱스가 typecast에 실패할 수 있습니다.ALTER COLUMN 이전에 인덱스를 삭제하고 이후에 다시 만들어야 합니다.기본값은 적절히 변경해야 합니다.
이것은 나에게 효과가 있었습니다.
막대 열을 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
이것을 사용해 보세요, 확실히 효과가 있을 거예요.
문자열 열을 정수로 변환하기 위해 레일 마이그레이션을 작성할 때 일반적으로 다음과 같이 말합니다.
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)'
위의 내용은 다른 데이터베이스 어댑터에서 알고 있는 내용과 유사합니다.숫자가 아닌 데이터가 있으면 결과가 예기치 않은 것일 수 있습니다(그러나 결국 정수로 변환됩니다).
저도 같은 문제가 생겼어요.변경하려는 열에 대한 기본 문자열 값이 있다는 것을 알게 되었습니다.기본값을 제거하면 오류가 사라집니다 :)
저도 같은 문제가 있었습니다.열의 기본값을 재설정하기 시작했습니다.
change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false
개발 환경(또는 운영 환경의 경우 데이터 백업)에서 작업하는 경우 먼저 DB 필드에서 데이터를 지우거나 값을 0으로 설정합니다.
UPDATE table_mame SET field_name= 0;
그런 다음 아래 쿼리를 실행하고 쿼리를 성공적으로 실행한 후 스키마 마이그레이션으로 마이그레이션 스크립트를 실행합니다.
ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0) USING field_name::numeric;
도움이 될 것 같습니다.
실수로 정수를 텍스트 데이터와 혼합했거나 혼합하지 않은 경우 처음에 아래 update 명령을 실행해야 합니다(위에 있지 않으면 변경 테이블이 실패함).
UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
문자가 다양한 빈 문자열 또는 Null입니다.
빈 문자열이나 null이 있는 열이 있는 경우 다음 오류 메시지가 나타날 수 있습니다.
invalid input syntax for type integer: ""
해결책
빈 문자열과 null을 0 값으로 가져오려면 병합과 nullif를 사용합니다.
ALTER TABLE peopleGroup ALTER numberPeople TYPE INT USING (cast ( coalesce( nullif( trim(numberPeople), '' ), '0' ) as integer ))
언급URL : https://stackoverflow.com/questions/13170570/change-type-of-varchar-field-to-integer-cannot-be-cast-automatically-to-type-i
'programing' 카테고리의 다른 글
푸시되지 않은 기존 커밋 메시지를 수정하는 방법은 무엇입니까? (0) | 2023.05.22 |
---|---|
Is Nothing 대 Is Nothing (0) | 2023.05.22 |
postgres 사용자가 존재하는지 확인하는 방법은 무엇입니까? (0) | 2023.05.22 |
피벗 테이블에서 그룹화된 날짜의 날짜 형식 변경 (0) | 2023.05.22 |
파이썬에서 객체가 바이트와 같은 객체인지 확인하는 적절한 방법은 무엇입니까? (0) | 2023.05.22 |