2017-03-15 8 views
1

제 데이터베이스에는 INTEGER 유형이있는 여러 필드가 있습니다. 나는 그들 중 일부를 BIGINT로 바꿀 필요가있다.INTEGER에서 BIGINT로 컬럼을 변경하십시오.

제 질문은 다음 명령을 사용할 수 있습니까?

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT; 

포함 된 데이터가 올바른 방식으로 변환 되었습니까? 변환 후이 열은 "실제"BIGINT 열입니까?

이 열 (트리거, ForeingKey, ...)에 제약 조건이 있으면 이것이 불가능하다는 것을 알고 있습니다. 그러나 제약이 없다면 이런 식으로 할 수 있습니까? 당신이

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT; 
파이어 버드는 INTEGER에서 BIGINT에 기존 데이터를 변환하지 않습니다

이 대신 생성됩니다를 실행하면

MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn 
+0

외래 키, 인덱스, 기본값, 규칙 등과 같이 하나 이상의 열에 제약 조건이없는 경우 ansquiser가 Yes이고 데이터가 corectly로 변환됩니다 (Firebird 3.0 For I Firebird 3.0 모르겠다.) –

+0

감사합니다. 왜냐하면 나는 아직 알지 못하는 미래의 문제에 부딪 치고 싶지 않기 때문입니다. – Andreas

+0

https://firebirdsql.org/refdocs/langrefupd25-ddl-table.html#langrefupd25-alter-table에 따르면 트리거 및 저장 프로 시저는 Firebird 2.5 이후 열 유형을 변경하는 것을 방지하지 않습니다. –

답변

6

:

또는 더 나은 도움말 - 열로 변환하는 것입니다 테이블의 새로운 형식 버전.

새 행을 삽입하거나 기존 행을 업데이트하면이 값은 BIGINT으로 저장되지만 Firebird를 읽으면 즉시 '이전'행이 INTEGER에서 BIGINT으로 즉시 변환됩니다. 이것은 사용자로서 투명하게 발생합니다. 이는 기존의 모든 행을 다시 작성하지 않아도되므로 IO (이전 버전의 행에 대한 가비지 수집 등)가 발생할 수 있습니다.

ALTER TABLE .. ALTER COLUMN을 사용하십시오. MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn을 사용하지 마십시오. 이 규칙에는 몇 가지 예외가 있습니다. 예를 들어, 문자가 새 문자 집합에 존재하지 않거나 (var) char 열을 더 짧게 변경하면 음영 오류를 방지하기 위해 (잠재적으로) 손실 문자 집합 변환을 select에서 수행하는 것이 좋습니다. (alter column으로는 수행 할 수 없음).

좀 더 구체적으로 말하자면 데이터베이스에 행이 기록되면 해당 행의 형식 버전 (버전 수)이 포함됩니다. 포맷 버젼은 Firebird가 그 행을 읽어야하는 행 (데이터 타입 등)에 대한 설명을 가리 킵니다. alter table은 새로운 형식의 버전을 생성 할 것이고, 그 형식은 새로운 행을 작성하거나 기존의 행을 갱신 할 때 적용될 것입니다. 이전 행을 읽을 때 Firebird는 행을 새로운 형식으로 표시하는 데 필요한 변환을 적용합니다 (예 : 열의 데이터 유형을 변환하여 기본값과 함께 새 열을 추가).

이러한 형식 버전도 alter table의 수가 제한되는 이유이기도합니다. 하나의 테이블에 255 개 이상의 alter table을 적용하는 경우 추가 변경이 허용되기 전에 must backup and restore the database (형식 버전은 1 바이트 임) 표.

+0

고마워요. 그래서 "ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;"를 사용할 것입니다. " 나는 255 문장의 한계에 대해 몰랐다. 알아두면 좋구나! 감사. 테이블의 현재 "버전 수"를 읽을 수있는 방법이 있습니까? – Andreas