2012-03-20 2 views
2

우리는 다양한 소스에 사용되는 CHAR "코드"필드가있는 수백 개의 테이블을 가진 DB를 가지고 있습니다. 이 코드 필드는 여러 테이블에 대한 기본 키 및 외래 키입니다.Char PK/FK를 어디서나 Varchar 또는 RTRIM으로 변환 하시겠습니까?

이제 ASP.NET 응용 프로그램에서 resource의 mouseover에이 코드를 표시하고 코드가 CHAR 필드 길이보다 짧으면 공백을 표시합니다. RTRIMing (종종 간과되는)을 통해이를 수정합니다.

  1. 가에서 변환하는 동안 자동으로 모든 PK/FK 제약 조건을 삭제하고 다시 만들 수있는 방법이 될 것이라고 성능에 미치는 영향이 안된다 그래서 우리는 활성 사용자의 낮은 100 단위에 몇 10 초를해야합니다 CHAR에서 VARCHAR로? 나는 INFORMATION_SCHEMA에서 약간 보았고 실현 가능성이있는 것 같습니다.

답변

1

은 많은 문제, 프런트 엔드에서뿐만 아니라 예상치 못한 공백이 발생합니다

  • 비교가 후행 공백을 고려하지 않을 때 논리 오류가 있습니다.
  • len()을 물으면 : 공백을 포함하거나 포함하지 않는 문자열의 길이를 반환합니까?
  • char은 필요한 것보다 많은 디스크 공간을 사용합니다. 기본 키는 테이블의 모든 인덱스에 포함되므로 사소한 공간을 추가 할 수 있습니다.

따라서 일반적으로 char에서 varchar까지 리팩터링하는 것이 좋습니다.

보유하고있는 테이블의 수에 따라 많은 작업이 필요할 수 있습니다. 먼저 열을 참조하는 모든 제약 조건을 제거해야합니다. 그렇다면 :

alter YourTable alter column YourColumn varchar(50) primary key 

그런 다음 제약 조건을 다시 추가합니다. 올바른 순서로 제약 조건을 추가/제거하려는 시도가 많이 필요하다는 것을 알게 될 것입니다. 예를 들어 foreign key은 참조 된 열에 unique 제약 조건이 필요합니다. 그러므로 unique 제약 전에 foreign key을 삭제해야합니다.

Right click database -> Tasks -> Generate Scripts은 올바른 순서가 아닌 제약 조건을 다시 작성하기위한 많은 설명을 제공합니다.

+0

SQL에서의 비교는 훌륭하지만 (공백 무시) C# 코드의 비교는 때때로 코더가 값을 RTRIM하고 비 RTRIM 값과 비교하기 때문에 문제를 일으킨다 . – FrancoisCN

1

나는 값이 프런트 엔드에 표시되는 방법에 따라 char 또는 varchar을 사용할지 여부에 대한 결정을하지 않을 것입니다.

어디서나 rtrim을 추가해야하는 경우이 필드가 포함 된 표 주위에보기를 만들고보기 내에서 rtrim을 한 번만 수행 할 수 있습니다.

그러나 필드가 항상 5 문자가 아닌 것 같기 때문에 varchar이 더 적절할 수 있습니다.

불행히도이를 수행하는 자동화 된 방법은 없습니다. 기본 및 외래 키 제약 조건을 모두 삭제하고 데이터 형식을 변경 한 다음 제약 조건을 다시 추가해야합니다. 내 경험 char에서

+0

업데이트 할 수있는 뷰로 만들고 기본 테이블의 이름을 바꾸고 업데이트 가능한 새 뷰에 이전 기본 테이블의 이름을 지정하십시오. –

+0

뷰의 문제는 때때로 로직 비교를위한 실제 키를 원할 때가 있습니다. 때때로 RTRIM 버전을 표시하기를 원할 것입니다. 이런 이유로 나는 varchar 변환을 선호하는 경향이있다. – FrancoisCN