문제

이제 우리는 도망 쳤습니다 int PK 열의 용량 (an IDENTITY) 나는 이것을하고 싶다 bigint, 그러나 간단합니다 ALTER TABLE 그 큰 테이블을 처리 할 수없는 것 같습니다. 그래서 내 질문은 : 실제 값을 유지하는 PK 열 유형을 어떻게 변경하고 참조 테이블도 변경해야합니까?

도움이 되었습니까?

해결책

KLE의 제안 외에도 다음 쿼리가 도움이 될 수 있습니다.

oldtable을 참조하는 테이블의 모든 제약 조건을 비활성화하려면 다음 쿼리의 출력을 실행하십시오.

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

필드의 변경으로 모든 데이터를 새 테이블로 옮기려면 다음을 시도하십시오.

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

이전 테이블을 떨어 뜨리려면 :

DROP TABLE oldTable

새 테이블의 이름을 기존 이름으로 바꾸려면 :

sp_rename newTable, oldTable

OldTable을 참조하는 테이블의 모든 제약 조건을 다시 활성화하려면 다음 쿼리의 출력을 실행하십시오.

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

도움이되기를 바랍니다 ...

다른 팁

우리가 할 일은 다음과 같습니다.

테이블을 저장하십시오

  1. 올바른 구조가있는 새 테이블을 만듭니다
  2. 이 테이블의 모든 제약을 비활성화하고 참조하는 제약 조건을 비활성화합니다.
  3. 필드의 변경으로 모든 데이터를 새 테이블로 옮깁니다. 배치로 수행 할 수 있습니다
  4. 비어 있으면 이전 테이블을 삭제하십시오
  5. 새 테이블의 이름을 기존 이름으로 바꿉니다
  6. 모든 테이블의 모든 제약 조건을 활성화합니다 (일부 FK 열 및 제약 조건도 수정이 필요할 것입니다 ... 그러나 PK가 아니므로 수정 가능합니다).

    6 편집 (Alexey에게 감사)

이것은 깨끗하고 배치가 가능하며 잘 이해됩니다.

아동 테이블도 변경해야합니다. 결국 당신은 이제 그들에게 큰 INT를 삽입하려고 노력할 것입니다. 나는 먼저 어린이 테이블 위로 바꿀 것입니다

이것은 쉽거나 짧은 과정이 아닙니다. 사용자에게 사용자에게 데이터베이스가 유지 보수를 위해 다운되었다고 말할 것을 제안합니다 (정해진 날짜에서 DEV 수행 시간이 얼마나 오래 걸리는지 측정 할 수 있음). 이러한 변화. 다른 테이블로 전환하는 동안 사용자가 추가 (또는 변경) 한 데이터를 잃고 싶지 않습니다. 서머 계절에 대해 당신이 메인 메타 윈도우를 havea 할 수 없다면 (그리고 당신이하는 데이터 무결성을 위해 강력히 제안합니다), 당신은 하위 테이블을 먼저 변경하여 오류를 삽입하지 않도록해야합니다. 많은 숫자가 거의 즉시 보입니다.

모든 것을 재현하려면 기본값, 트리거, 구역 인덱스 점검 등을 포함한 전체 데이터베이스 구조를 스크립트해야합니다.

Dev의 스크립트를 통해이 모든 작업을 수행하십시오. 프로세스를 테스트 한 후에는 하나의 프로드를 훨씬 쉽게 수행하는 것이 훨씬 쉬워집니다.

PK 데이터 유형이 변경된 새 데이터베이스 만 생성 한 다음 데이터를 내보내거나 데이터를 새로 삽입 한 다음 새 데이터베이스 이름을 바꿀 수 있다고 생각합니다. 물론 참조 테이블이 많고 이전과 호환되지 않는 새로운 PK 데이터 유형이있는 경우 실제.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top