IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Probleme de contrainte d unicité :'(


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Par défaut Probleme de contrainte d unicité :'(
    Bonjour, je suis en stage et je fais des base de données. J'ai un petit probleme.
    Je pense que rendre un champ de type TEXT unique le résoudrai.
    Mais ca ne marche pas.

    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 ..



    Je vous explique ce que je veux faire exactement.
    Peut etre que je prend le probleme dans le mauvais sens et qu'une contrainte d'unicité ne m'aidera pas.

    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.

    Si quelqu'un peut m'aider, je suis preneur.
    Merci d'avoir lu jusque ici....

  2. #2
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Bonjour,

    Citation Envoyé par xavioche77 Voir le message
    #1071 - La clé est trop longue. Longueur maximale: 767
    Que ce soit une colonne de type TEXT ou BLOB vous rencontrer cette erreur à la création de l'index avec MySQL.

    Ce n'est pas l'idéal mais il est possible de garantir l'unicité d'une colonne au moment de l'insertion.
    Il y a peut-être d'autre solutions, mais vous pouvez peut-être vous en sortir avec une colonne contenant un hash (exemple: MD5()) et en faisant des requêtes dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO laTable(colSequence, colHash) 
      SELECT 'abc', MD5('abc')
      FROM (SELECT 1) AS td -- Astuce pour n'avoir qu'une ligne (comme Dual d'Oracle)
      WHERE MD5('abc') NOT IN (
        SELECT colSequence FROM laTable
      )

Discussions similaires

  1. Contrainte d'unicité probleme de casse
    Par snopims dans le forum Langage SQL
    Réponses: 6
    Dernier message: 06/12/2007, 22h40
  2. Architecture 3 tiers et contrainte d'unicite
    Par nkonito dans le forum ASP.NET
    Réponses: 26
    Dernier message: 07/03/2007, 21h43
  3. Réponses: 6
    Dernier message: 12/12/2006, 14h30
  4. gestion des contraintes d'unicité
    Par GMI3 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/12/2006, 18h00
  5. contrainte d'unicité un peu spéciale....
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/11/2004, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo