Применять уникальные строки в MySQL - PullRequest
2 голосов
/ 18 сентября 2008

У меня есть таблица в 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 - это идентификатор, указывающий на владельца клиента.

Я думал, что смогу применить это с помощью уникального индекса для CLIENT_NAME и OWNER_ID,

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

но MySQL выдает ошибку:

Ошибка выполнения команд SQL для обновления таблицы. Указанный ключ был слишком длинным; максимальная длина ключа составляет 765 байт (ошибка 1071)

У кого-нибудь еще есть идеи?

Ответы [ 4 ]

9 голосов
/ 18 сентября 2008

MySQL не может обеспечить уникальность ключей длиной более 765 байт (и, очевидно, 500 символов UTF8 могут превысить это ограничение).

  1. Действительно ли CLIENT_NAME должен иметь длину 500 символов? Кажется немного чрезмерным.
  2. Добавьте новый (более короткий) столбец с хешем (CLIENT_NAME). Вместо этого используйте MySQL для обеспечения уникальности этого хэша.
0 голосов
/ 18 сентября 2008

Что-то кажется странным в этой таблице; Я бы подумал о рефакторинге. На что ссылаются 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, по-видимому, идентифицирует только отношения клиент / владелец, которым действительно не нужен отдельный идентификатор, так как это просто отображение.

0 голосов
/ 18 сентября 2008

Здесь . Для кодировки UTF8 MySQL может использовать до 3 байтов на символ. CLIENT_NAME имеет размер 3 x 500 = 1500 байт. Укоротить CLIENT_NAME до 250.

позже: +1 для создания хэша имени и использования его в качестве ключа.

0 голосов
/ 18 сентября 2008

Вы смотрели на ОГРАНИЧЕНИЕ ... УНИКАЛЬНО?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...