Probleme de contrainte d unicité

xavioche
Invité n'ayant pas de compte PHPfrance

16 avr. 2010, 10:33

Bonjour,

Je cherche à rendre UNIQUE un champs de type TEXT.
En fait, je dois créer un champs pouvant faire au moins 10 000 caractères. Et ca me pose des problèmes lors de la mise en place des contraintes d'unicité.
J'utilise easyphp.


La commande:
ALTER TABLE `sequencearn` ADD `Sequence` TEXT UNIQUE

Le message d'erreur:
#1170 - La colonne 'Sequence' de type BLOB est utilisée dans une définition d'index sans longueur d'index

Après quelques recherches sur internet , j'ai essayé d'autre solution :
ALTER TABLE `sequencearn` ADD `Sequence` TEXT UNIQUE (
Sequence( 10000 )
)

Mais là, méchante erreur de syntaxe. Sur le site, il dise qu'il faut donner la taille sur laquelle l index va porter .


J'ai aussi essayé de changer le type en mettant un VARCHAR de taille 10 000.
mais en essayant de le rendre unique ca ne marche pas non plus.

ALTER TABLE `sequencearn` ADD UNIQUE (
`Sequence`
)
#1071 - La clé est trop longue. Longueur maximale: 767

Comme il faut absolument que je m'assure que ce champs est unique, je sais pas comment faire.
J'ai pas envie de faire ca par un script. Ca va être un peu compliqué et long en temps ..

Si quelqu'un a une idée, je suis preneur..

Merci d'avoir lu :p

Mammouth du PHP | 568 Messages

16 avr. 2010, 10:48

C'est quoi le but???

Doit y avoir un petit soucis de conception là, non?

Rendre un text de 10000 caractères UNIQUE, c'est vraiment moyen je trouve...

Mammouth du PHP | 672 Messages

16 avr. 2010, 10:51

Par curiosité :

- Ca veut dire quoi, K7X9 ? Pas trouvé plus obscur, comme titre ?
- Quelle est la structure de la table ? En quoi est-il obligatoire de rendre ton champ unique ?
J'avoue qu'une contrainte d'unicité sur un champ Blob, j'ai du mal à comprendre l'intérêt... Accessoirement, ça a l'air infaisable au niveau de la base, techniquement parlant.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 avr. 2010, 10:54

Par curiosité :

- Ca veut dire quoi, K7X9 ? Pas trouvé plus obscur, comme titre ?
Pour info, j'ai modifié le titre du topic et supprimé le sujet en doublon
Quand tout le reste a échoué, lisez le mode d'emploi...

Xavioche
Invité n'ayant pas de compte PHPfrance

16 avr. 2010, 11:01

En fait, j'ai un logiciel auquel on donne en entrée une séquence d ADN et qui renvoi un tas de résultat .
Ce qui se passe c est que si dans le futur on améliore le logiciel il trouvera des résultats possiblement différents.

une séquence >>> tas de résultats ( 1)

la meme séquence plus tard>>>> tas de résultats (2) qui peut etre différents

Je veux donc stocker la séquence qu'une seule fois.
Et rajouter, le tas de résultats 2 seulement si il est différent du tas 1


C un peu compliqué a expliquer je dois avouer ..

Mammouth du PHP | 672 Messages

16 avr. 2010, 11:20

Et la table est structurée comment ?

- S'il s'agit d'un "tas de résultats", ru peux peut-être les stocker dans plusieurs champs.

- Un moyen de contourner le problème : tu rajoutes un champ à ta table, dans lequel tu stockes une somme ce contrôle du "tas de résultats" (via MD5, par exemple).
Les chances pour que deux chaines différentes aient le même checksum sont suffisament faibles pour être négligées. Donc, une contrainte d'unicité dessus te permettra de régler le problème. Au pire, si tu n'as vraiment pas de chance, tu perdras un résultat différent du premier (s'il a le même MD5, ce qui est relativement improbable)

Mammouth du PHP | 568 Messages

16 avr. 2010, 11:26

Le cas de l'emprunte md5 est une bonne solution je pense, si c'est un fichier tu peux utiliser sha1_file

http://fr2.php.net/manual/fr/function.sha1-file.php

Xavioche
Invité n'ayant pas de compte PHPfrance

16 avr. 2010, 11:53

ok je m explique surement très mal..

J'ai deux tables : Sequence et Resultats

Séquence(id_seq,taille,type,sequence); // le champs séquence est de type text il doit pouvoir contenir 10 000 caractere

Resultat(id,longueur,position ect plein de résultat) //dedans il y a la clé étrangere id_seq



Je parse un fichier, je récupère dedans le champ séquence de Séquence et les résultats de la table résultat qui sont associés à cette séquence. Donc pour une séquence précise j'ai un ensemble de résultats .
Ca marche tres bien.

Ceci étant dit, le logiciel qui sort ces résultats est appelé a évolué. Il peut donc arriver que je relance un parsing de fichier.
Si ce fichier contient la meme séquence qu'une deja entré dans la base, je stocke les résultats que si il sont différents de ceux deja present dans la base ( cette fonction sera implémenté en php)

Mon probleme est que actuellement, dans ma base de données, si je parse un fichier et que je récupere une séquence et que cette séquence est deja présente dans la base, son id ne sera pas le même. Il sera en effet incrémenté automatiquement .
Pour tester cela, j'ai modifier moi meme mon fichier a parser. J'ai mis une séquence que je savais dans la base. Et la, dans la base ces deux séquences n ont pas le même id.

Il faut que en parsant le fichier, si la séquence que je récupere est deja présente dans la base, son id soit le même.

D'ou mon idée de rendre le champ séquence unique. Comme ca, la base ne peut pas stocké deux séquence identiques.