MySQL에서 고유 행 적용
-
01-07-2019 - |
문제
안에 테이블이 있어요 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 문자가 이 제한을 초과할 수 있음).
- CLIENT_NAME은 정말 500자여야 하나요?좀 과한 것 같네요.
- 해시(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합니다.