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

MySQL Discussion :

#1170 - La colonne 'story' de type BLOB est utilisée dans une définition d'index sans longueur d'index


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut #1170 - La colonne 'story' de type BLOB est utilisée dans une définition d'index sans longueur d'index
    Bonjour la communauté

    Dans le cadre d'un projet PHP, j'utilise PHP/myadmin et dois modifier la structure de ma table. Cependant lors de l'ajout d'un index unique, je rencontre l'erreur suivante
    Code :
    #1170 - La colonne 'story' de type BLOB est utilisée dans une définition d'index sans longueur d'index
    Ca veut simplement dire que pour indexer un champ BLOB ou TEXT (TIBYBLOB, TINYTEXT, VARCHAR, CHAR, etc)
    il faut spécifier combien de caractères seront indexés (les N premiers de chaque valeur du champ).

    CREATE TABLE `adconf`.`conf` (
    `id` INT(11) NOT NULL AUTO_INCREMENT ,
    `ac_refnumber` INT(11) NOT NULL ,
    `title` VARCHAR(255) NOT NULL ,
    `story` LONGTEXT NOT NULL ,
    `creation_date` DATETIME NOT NULL ,
    `real_date` DATE NOT NULL ,
    PRIMARY KEY (`id`),
    ) ENGINE = MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
    PS => ce code ne permet pas de m'amender de l'insertion de doublon dans les champs story et ac_refnumber et, comme dis les ALTER TABLE sur STORY (TEXT) ne fonctionne pas.

    Peut-être ma requête n'est pas correct ou mal structuré et, c'est pourquoi j'en appel à votre aide, et pour mon besoin je souhaite recréer ma table mais ce que je voudrais obtenir en terme de champs :

    (`id` INT(11) NOT NULL AUTO_INCREMENT ,
    `ac_refnumber` INT(11) NOT NULL , // m'assurer de ne pas insérer de valeur en doublons
    `title` VARCHAR(255) NOT NULL ,
    `story` LONGTEXT NOT NULL , // ce champs doit absolument être de type TEXT car doit contenir jusqu'à 30000 caractères et, // m'assurer de ne pas insérer de valeur en doublons
    `creation_date` DATETIME NOT NULL ,
    `real_date`DATE NOT NULL ,
    );
    Pourriez-vous m'indiquer quelle serait la bonne syntaxe à adopter afin d'obtenir ce type de script sql ?

  2. #2
    Membre chevronné Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Par défaut
    hello,

    On ne peut pas mettre de contrainte UNIQUE sur un champ texte. en revanche ce que vous pouvez faire, c'est rajouter un champ pour stocker le hash du text et mettre une contrainte d'unicité dessus.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut
    Merci pour ton intervention sebwar j'apprécie.

    On ne peut pas mettre de contrainte UNIQUE sur un champ texte.
    Oui je sais, du moins j'ai vite compris cela, d'ou la présence de ce sujet.

    rajouter un champ pour stocker le hash du text et mettre une contrainte d'unicité dessus
    Pourquoi faire cela, enfin, ce que je veux dire c'est, peux tu m'expliquer l’intérêt du hash ? et, la contrainte portera sur les deux précédents champs (story et ac_refnumber) ou dorénavant sur trois champs ?

    Faut-il repartir d'un sql propre ? ou peut-on modifier mon code sql pour arriver à cela ? peux-tu m'orienter sur la réalisation du code ?

    Merci d'avance

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    L'idée est que l'index UNIQUE soit sur la colonne portant le hash du texte.

    Pour la colonne ac_refnumber, il suffit de poser un index UNIQUE dessus.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut jelmouss.

    Citation Envoyé par jelmouss
    PS => ce code ne permet pas de m'amender de l'insertion de doublon dans les champs story et ac_refnumber et, comme dis les ALTER TABLE sur STORY (TEXT) ne fonctionne pas.
    Pour la colonne "ac_refnumber", vous pouvez créer un index unique, cela ne pose aucun problème.

    Mais en ce qui concerne la colonne "story", je ne comprends pas trop l'intérêt de rendre cette colonne unique, car vous pouvez stocker jusqu'à 2^32 (4 294 967 296) caractères.
    Pouvez-vous nous expliquer l'intérêt de l'unicité sur une colonne contenant que du texte ?

    En ce qui concerne la colonne "story", je la mettrais dans une table à part.
    Pour cela utilisez un identifiant qui d'une part sera votre clef primaire, mais aussi la clef étrangère qui pointera sur "id" de votre table adconf".

    @+

  6. #6
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut
    Bonjour et merci pour vos retours j'apprécie.

    Sebwar CinePhil
    On ne peut pas mettre de contrainte UNIQUE sur un champ texte. en revanche ce que vous pouvez faire, c'est rajouter un champ pour stocker le hash du text et mettre une contrainte d'unicité dessus.
    L'idée est que l'index UNIQUE soit sur la colonne portant le hash du texte.
    Pour être honnete je ne pense pas avoir saisi la subtilité de cette solution en revanche pour contourner ma problématique, ce que j'ai pu faire c'est poser un index sur le champs "ac_refnumber" code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `adconf`.`conf` (
     `id` INT(11) NOT NULL AUTO_INCREMENT , 
     `ac_refnumber` INT(11) NOT NULL , 
     `title` VARCHAR(255) NOT NULL , 
     `story` TEXT NOT NULL , 
     `creation_date` DATETIME NOT NULL , 
     `real_date` DATE NOT NULL , 
     constraint pk_confessions primary key(`id`), 
     UNIQUE (`ac_refnumber`) USING HASH) // aprés pour le HASH je ne suis pas sur qu'il ait bien été pris en compte puisque la base me renvoie un index de type "BTREE"
    ENGINE = MyISAM;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Artemus24 
    En ce qui concerne la colonne "story", je la mettrais dans une table à part.
    Pour cela utilisez un identifiant qui d'une part sera votre clef primaire, mais aussi la clef étrangère qui pointera sur "id" de votre table adconf".
    Merci pour cette solution, elle n'est pas mal je vais l'étudier, d'autant que cela pourrais être une table composite qui ferait lien avec la table conf & com (commentaire) ...

    pour votre apport et participation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/06/2018, 01h26
  2. Réponses: 2
    Dernier message: 20/05/2015, 17h49
  3. Comment créer un type puis l'utiliser dans une méthode ?
    Par montis dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 19/05/2012, 22h48
  4. Supprimer une colonne d'une feuille si elle est vide dans une autre
    Par xave dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/02/2008, 14h05
  5. Problème quand le champs de type Blob est null
    Par med_anis_dk dans le forum JDBC
    Réponses: 6
    Dernier message: 12/05/2007, 01h34

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