programing

varchar 필드 유형을 정수로 변경합니다. "정수 유형으로 자동 캐스트할 수 없습니다."

bestprogram 2023. 5. 22. 21:50

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