문제

안에 테이블이 있어요 MySQL 3개의 필드가 있고 두 필드 사이에 고유성을 적용하고 싶습니다.여기 테이블이 있어요 DDL:

CREATE TABLE `CLIENT_NAMES` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

그만큼 ID 필드는 서로게이트 키입니다(이 테이블은 ETL로 로드됩니다).그만큼 CLIENT_NAME 클라이언트 이름을 포함하는 필드입니다 OWNER_ID ID는 클라이언트 소유자를 나타냅니다.

고유 인덱스를 사용하여 이를 시행할 수 있다고 생각했습니다. CLIENT_NAME 그리고 OWNER_ID,

ALTER TABLE `DW`.`CLIENT_NAMES` 
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);

하지만 MySQL에서는 오류가 발생합니다.

테이블을 업데이트하기 위해 SQL 명령을 실행하는 중에 오류가 발생했습니다.지정된 키가 너무 깁니다.최대 키 길이는 765바이트입니다(오류 1071).

다른 사람 아이디어가 있나요?

도움이 되었습니까?

해결책

MySQL은 765바이트보다 긴 키에 고유성을 적용할 수 없습니다(500개의 UTF8 문자가 이 제한을 초과할 수 있음).

  1. CLIENT_NAME은 정말 500자여야 하나요?좀 과한 것 같네요.
  2. 해시(CLIENT_NAME)인 새(더 짧은) 열을 추가합니다.대신 MySQL을 사용하여 해당 해시에 고유성을 적용하십시오.

다른 팁

CONSTRAINT를 보셨나요?고유한?

이 테이블에는 뭔가 좀 이상한 것 같습니다.나는 실제로 그것을 리팩토링하는 것에 대해 생각할 것입니다.ID와 OWNER_ID는 무엇을 의미하며, 이들 사이의 관계는 무엇인가요?

갖는 것이 의미가 있습니까?

CREATE TABLE `CLIENTS` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
# other client fields - address, phone, whatever
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `CLIENTS_OWNERS` (
`CLIENT_ID` int(11) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`CLIENT_ID`,`OWNER_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

500자 문자열에 이와 같은 고유 키를 추가하는 것은 정말 피하고 싶습니다.두 정수에 고유성을 적용하는 것이 훨씬 더 효율적이며 테이블의 ID는 실제로 ID가 필요한 항목을 참조해야 합니다.귀하의 버전에서는 ID 필드는 단지 매핑일 뿐이므로 별도의 ID가 필요하지 않은 클라이언트/소유자 관계만 식별하는 것 같습니다.

여기.UTF8 문자 세트의 경우 MySQL은 문자당 최대 3바이트를 사용할 수 있습니다.CLIENT_NAME은 3 x 500 = 1500바이트입니다.줄이다 CLIENT_NAME 250으로.

나중에: 이름의 해시를 생성하고 이를 키로 사용하는 데 +1합니다.

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