PostgreSQL 8.4에서 열 데이터 유형을 문자에서 숫자로 변경하는 방법


136

다음 쿼리를 사용하고 있습니다.

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

에서 열의 데이터 유형을 변경하기 character(20)numeric(10,0)하지만 오류를 얻고있다 :

"code"열을 숫자 유형으로 캐스트 할 수 없습니다

답변:


241

당신은 사용할 수 있습니다 USING:

선택적 USING절은 이전 항목에서 새 열 값을 계산하는 방법을 지정합니다. 생략하면 기본 변환은 이전 데이터 유형에서 새 유형으로 캐스트 된 지정과 동일합니다. USING새로운 유형으로 구에서 암시 적 또는 할당 캐스트가없는 경우 절을 제공해야합니다.

따라서 데이터에 따라 작동 할 수 있습니다.

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

code숫자로 캐스트 할 수없는 것이 있으면 실패합니다 . USING이 실패하면 열 유형을 변경하기 전에 숫자가 아닌 데이터를 수동으로 정리해야합니다.


이 열은 다른 테이블에서 외래 키로 사용됩니다. 데이터 유형도 변경해야한다고 생각합니까?
user728630

2
@ user728630 : FK를 삭제하고 두 열을 모두 변경 한 다음 FK를 다시 추가해야합니다. 재생할 테스트 데이터베이스와 프로덕션 데이터베이스의 백업이 있습니까?
mu는

외래 키 제약 조건을 삭제하고 데이터 유형을 변경했지만 그 후에 FK를 추가 할 수 없습니다. 다음 오류 발생 오류 : 테이블 "인보이스"에서 삽입 또는 업데이트가 외래 키 제약 조건 "invoice_presale_fk"을 위반합니다. 세부 정보 : 키 (sale, cpf_cnpj) = (4,05943560000101)가 "사전 예약"테이블에 없습니다.
user728630

2
@funwhilelost 타입 캐스트 입니다. 연결된 ALTER TABLE 문서는 USING과 함께 사용할 수있는 내용을 다룹니다.
mu는 너무 짧습니다

3
@muistooshort 나는 문서에서 볼 때 실제로 표현입니다. 더 이해가 되네요. 캐스트 유형은 나를 지키지 못했습니다. 내가 함께 끝났다TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost

7

귀하의 경우 VARCHAR열 (이다 빈 문자열이 포함 되지 같은 NULL당신이 기억 하듯이 PostgreSQL을위한)을 당신은 기본을 설정하려면 다음의 라인에 뭔가를 사용해야 할 것입니다 :

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

( 이 답변 의 도움으로 찾았습니다 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.