2009-06-07 3 views
1

복합 기본 키가 있는데,이 키가 함께 큰 (~ 2000 바이트) 것으로 나타납니다. 나는 성능에 대한 고려 사항이 없으며 유일성을 강화하는 기본 키를 원합니다.MySql 기본 키> 900/1000 바이트?

MySql doesn't like long primary keys. 이 문제를 해결할 방법이 있습니까? 인덱스를 만들지 않고 유일성을 강화하는 것일까?

기본 키를 사용하기 위해 UTF8 대신 ASCII를 사용하고 싶지 않습니다 (UTF8 문자는 3 바이트 걸림). 기본 키

CREATE TABLE `configuration` (
    `Section` varchar(200) NOT NULL, 
    `StoredKey` VARCHAR(200) NOT NULL, 
    `ServiceName` VARCHAR(300) NOT NULL, 
    `ServiceMajorVersion` int unsigned NOT NULL, 
    `ServiceMinorVersion` int unsigned NOT NULL, 
    `ServiceInstanceID` VARCHAR(100) NOT NULL, 
    `StoredValue` VARCHAR(1024) 

, PRIMARY KEY (`Section`, `StoredKey`, `ServiceName`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
+0

은 테이블 정의를 게시 할 것을 제안합니다 ... –

+0

좋아요, 테이블 게시 됨. – ripper234

답변

3

사용 autoincremented 정수를 다른 고유 키를 추가

내 테이블은 다음과 같이 정의된다.

또는 당신 unhex(md5(concat(열 값으로)))binary(16) 1 차 키를 사용하여 시도 할 수 있습니다.

+2

많은 사람들이 생각하는 것처럼 보이지만, "자동 증가 정수 PK를 사용하십시오."는 항상 데이터베이스 설계 문제에 대한 해답이 아닙니다. 이 경우이 스키마에서 훨씬 더 심층적 인 문제 만 숨기고 적절한 고유성 제약 조건을 적용하는 데는 전혀 쓸모가 없습니다. – kquinn

+0

@kquinn : 물론.나는 긴 PK로 작업하는 방법에 답하고 있습니다. _ 사용하는 이유가 있습니다. – Kornel

2

데이터베이스를 이해하지 않고 말하기는 어렵지만 정규화가 필요할 수 있습니다. UNIQUE INDEX은 기본 키가 아니며 고유 한 단일 열이 이미있는 경우이를 기본 키로 만들고 그렇지 않은 경우 대리 키 (INTEGER AUTO_INCREMENT)를 만들 수 있습니다.

0

@ pornel과 @CadeRoux가 이미 게시 한 내용에 동의하십시오. 자동 증분 된 정수 열로 서로 게이트 기본 키 (ConfigurationId)를 만드는 것이 더 나을 것입니다. dthen은 별도의 고유 인덱스를 만듭니다.

4

DB 구조 디자인에 대한 책을 읽어야합니다. 그런 다음 기본 키가있는 테이블을 가지지 않아야합니다. 또는 DB 구조를 작성한 사람 (프로토 타입)을 고용하십시오. 이것은 단지 친절한 조언 일뿐입니다.

+0

감사합니다 noonex, 다른 답변은 지금까지 잘못된 트랙에 있습니다. Nail 두드리기 : 오래된 구두 또는 유리 병? (http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx) – MGOwen

4

@porneL이 사건에 대한 정확한 답이있다, 그러나, @Cade 루 및 @noonex또한 올바른 : 데이터베이스를 엑셀처럼 사용되는 것은 아니다.

당신은 보조 테이블을 가져야한다 : 각 테이블에

CREATE TABLE ServiceInstance (
    ID int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    Hash binary(16) NOT NULL, 
    ServiceInstanceID varchar(100) NOT NULL, 
    UNIQUE(Hash) 
); 

을 구성 줄에 고유 한 것입니다 데이터를 제외하고.

삽입, 수행

INSERT INTO ServiceInstance (Hash, ServiceInstanceID) VALUES (unhex(md5('whatever')), 'whatever'); 

그런 다음, 기본 테이블이됩니다

:

CREATE TABLE `configuration` (
    `Section_ID`   int unsigned NOT NULL, 
    `StoredKey_ID`  int unsigned NOT NULL, 
    `ServiceName_ID`  int unsigned NOT NULL, 
    `ServiceMajorVersion` int unsigned NOT NULL, 
    `ServiceMinorVersion` int unsigned NOT NULL, 
    `ServiceInstanceID` int unsigned NOT NULL, 
    `StoredValue`   VARCHAR(1024), 
    UNIQUE (`Section_ID`, `StoredKey_ID`, `ServiceName_ID`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceInstanceID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

사용하여 UNIQUE 키를 대신, 당신은 행에 접근 할 때 기본 키는 일반적으로 사용되는로 기본 키에 의해 항상. 단지 제약 조건이라면 대신 UNIQUE를 사용하십시오.

관련 문제