Применять уникальные строки в MySQL

У меня есть таблица в 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 выдает ошибку:

Error executing SQL commands to update table. Specified key was too long; max key length is 765 bytes (error 1071)

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
1 503
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Ответ принят как подходящий

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

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

Юникод - это кодировка переменной длины. Символы могут иметь размер от одного до четырех байтов, и только исходные 128 символов ASCII кодируются в одном байте.

Joe Mahoney 18.09.2008 21:37

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

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

Сказать, что UTF-8 использует 3 байта / символ, неверно. Как указано на странице, оно может принимать ДО этого значения, и что делает невозможным использование в MySQL, так это пессимистический подход.

André Chalella 18.09.2008 09:06

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

Другие вопросы по теме