Question

J'ai une table dans MySQL qui contient 3 champs et je souhaite imposer l'unicité de deux des champs. Voici la table 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;

Le champ ID est une clé de substitution (cette table est chargée avec ETL). CLIENT_NAME est un champ contenant les noms des clients. Le OWNER_ID est un identifiant indiquant le propriétaire d'un client.

Je pensais pouvoir appliquer ceci avec un index unique sur NOM_CLIENT et ID_PROJET ,

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

mais MySQL me donne une erreur:

  

Erreur lors de l'exécution des commandes SQL pour mettre à jour la table.   La clé spécifiée était trop longue. La longueur maximale de la clé est de 765 octets (erreur 1071)

Quelqu'un d'autre a des idées?

Était-ce utile?

La solution

MySQL ne peut pas imposer l'unicité des clés de plus de 765 octets (et apparemment, 500 caractères UTF8 peuvent dépasser cette limite).

  1. CLIENT_NAME doit-il vraiment comporter 500 caractères? Cela semble un peu excessif.
  2. Ajoutez une nouvelle colonne (plus courte) qui s'appelle hash (CLIENT_NAME). Demandez à MySQL d’appliquer à la place l’unicité sur ce hachage.

Autres conseils

Avez-vous examiné CONSTRAINT ... UNIQUE?

Quelque chose semble un peu étrange à propos de cette table; Je penserais en fait à le refactoriser. À quoi ID et OWNER_ID font-ils référence et quelle relation existe-t-il entre eux?

Aurait-il un sens d'avoir

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;

J'éviterais vraiment d'ajouter une clé unique comme celle-ci sur une chaîne de 500 caractères. Il est beaucoup plus efficace d'imposer l'unicité de deux éléments, plus un identifiant dans une table doit vraiment faire référence à quelque chose qui nécessite un identifiant; dans votre version, le champ ID semble identifier uniquement la relation client / propriétaire, qui n'a pas vraiment besoin d'un identifiant séparé, car il ne s'agit que d'un mappage.

ici . Pour le jeu de caractères UTF8, MySQL peut utiliser jusqu'à 3 octets par caractère. CLIENT_NAME est 3 x 500 = 1500 octets. Raccourcissez CLIENT_NAME à 250.

plus tard: +1 pour créer un hachage du nom et l'utiliser comme clé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top