2009-11-18 4 views
3

En utilisant MySQL 5MySQL - Prévenir les enregistrements en double dans la table via l'index?

J'ai une table comme ceci:

date (varchar) 
door (varchar) 
shift (varchar) 
route (varchar) 
trailer (varchar) 
+ other fields 

Ce tableau contient le contenu généré par l'utilisateur (copié depuis une autre table « maître ») et pour empêcher les utilisateurs de créer les mêmes données plus que 1x la table a un index unique créé en fonction des champs spécifiés ci-dessus.

Le problème est que l'index "prévention des doublons" ne fonctionne pas.
Les utilisateurs peuvent toujours ajouter des enregistrements en double sans qu'aucune erreur ne soit signalée.

Ce problème est-il dû au fait que je ne comprends pas quelque chose sur le fonctionnement des index?

Ou

Est-il un éventuel conflit avec le champ de clé primaire (autoincrementing int)?

CREATE TABLE ressemble à ceci:

CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" (
"Date" varchar(12) default NULL, 
"door" varchar(12) default NULL, 
"Shift" varchar(45) default NULL, 
"route" varchar(20) default NULL, 
"trailer" varchar(45) default NULL, 
"fieldA" varchar(45) default NULL, 
"fieldB" varchar(45) default NULL, 
"fieldC" varchar(45) default NULL, 
"id" int(10) unsigned NOT NULL auto_increment, 
PRIMARY KEY ("id"), 
UNIQUE KEY "duplicate_preventer" ("Date","door","Shift","route","trailer"), 

Une ligne dupliquée est:

date  door shift  route trailer 

10/4/2009 W17 1st Shift TEST-01 NULL 
10/4/2009 W17 1st Shift TEST-01 NULL 
+0

montrent l'instruction CREATE TABLE, s'il vous plaît. – dnagirl

+0

Pouvez-vous poster quelques lignes que vous considérez comme des doublons? –

+0

Quel moteur de base de données utilisez-vous, par exemple InnoDB ou MyISAM? –

Répondre

5

Les utilisateurs peuvent toujours ajouter des enregistrements en double sans signaler d'erreurs.

Que voulez-vous dire par "duplicate records"?

Selon le classement, le cas, l'accent etc. peut la matière, et 'test' et 'TEST' ne seront pas considérés comme des doublons.

Pourriez-vous me poster des résultats de SHOW CREATE TABLE mytable?

Aussi, pourriez-vous s'il vous plaît exécuter cette requête:

SELECT date, door, shift, route, trailer 
FROM mytable 
GROUP BY 
     date, door, shift, route, trailer 
HAVING COUNT(*) > 1 

Si elle retourne les lignes, le problème est avec l'indice; Si ce n'est pas le cas, le problème est avec votre définition d'un "doublon".

Mise à jour:

Vos colonnes permettent NULL s.

NULL valeurs MySQL ne sont pas considérés en double du point de vue d'un indice UNIQUE:

CREATE TABLE testtable (door VARCHAR(20), shift VARCHAR(15), UNIQUE KEY (door, shift)); 

INSERT 
INTO testtable 
VALUES 
('door', NULL), 
('door', NULL); 

SELECT door, shift 
FROM testtable 
GROUP BY 
     door, shift 
HAVING COUNT(*) > 1; 

De documentation:

Un indice UNIQUE crée une contrainte telle que toutes les valeurs du l'index doit être distinct. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec une valeur de clé qui correspond à une ligne existante. Cette contrainte ne s'applique pas aux valeurs NULL à l'exception du moteur de stockage BDB. Pour les autres moteurs, un index UNIQUE permet plusieurs valeurs NULL pour les colonnes pouvant contenir NULL. Si vous spécifiez une valeur de préfixe pour une colonne dans un index UNIQUE, les valeurs de colonne doivent être uniques dans le préfixe.

+0

Il renvoie la ligne dupliquée - le problème est donc l'index. –

+0

Aussi - un enregistrement dupliqué à moi a tous les champs (dans l'index) étant exactement les mêmes. –

+0

Pourriez-vous s'il vous plaît poster la sortie de 'SHOW CREATE TABLE mytable'? Le problème est définitivement lié à l'index, il ne crée pas 'UNIQUE' ou n'est pas créé du tout. – Quassnoi

3

Etes-vous sûr que vous utilisez index unique au lieu d'un index normal?

create unique index uix on my_table (date, door, shift, route, trailer); 

également ce genre d'indice ne fait que cette combinaison de champs est unique, vous pouvez par exemple avoir plusieurs dates en double si, par exemple, porte sur le terrain est différent sur chaque ligne. La différence peut être difficile à repérer, par exemple un espace à la fin de la valeur ou une différence minuscule/majuscule.

Mise à jour: votre index unique semble être en ordre. Le problème est ailleurs.

+0

I généralement créer mes index via MySQL Administrator ou dans ce cas HeidiSQL. Je définis les colonnes souhaitées pour l'index, puis sélectionnez l'option 'unique'. –

0

Je pense que vous voudriez créer une contrainte unique sur les champs que vous ne voulez pas dupliqués. Cela créera à son tour un index unique.

Comme ceci:

ALTER TABLE VotreTable ADD CONTRAINTE uc_yourconstraintname UNIQUE (date, porte, changement, route, remorque)

Questions connexes