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

SQL Procédural MySQL Discussion :

Creation d'une table indexée sur un TINYTEXT


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Points : 113
    Points
    113
    Par défaut Creation d'une table indexée sur un TINYTEXT
    Salut à tous,
    je suis en train de mettre en place ma base de données.
    Une des tables renseigne sur du matériel.
    Elle a donc en PK le champ serial qui est de type TINYTEXT.

    Or lors de la création, Mysql me dit que:
    #1170 - BLOB/TEXT column 'serial_hw' used in key specification without a key length
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DROP TABLE IF EXISTS `hardware`;
    CREATE TABLE `hardware` (
        `serial_hw` TINYTEXT not null,
        `brand_hw` TINYTEXT,
        `model_hw` TINYTEXT,
        `desc_hw` TINYTEXT,
        `cost_hw` FLOAT,
        `wieght_hw` FLOAT,
      PRIMARY KEY  (`serial_hw`)
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Dans la FAQ MySQL est bien précisé:
    Les champs suivants: TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT contrairement à CHAR et VARCHAR ne doivent pas être utilisés en spécifiant une taille.
    Une idée ?
    Merci

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut,

    La définition de la colonne TEXT ne doit pas comporter de taille, mais la définition de la clé si :

    BLOB and TEXT columns also can be indexed, but a prefix length must be given. [...]

    Only the MyISAM, BDB, and InnoDB storage engines support indexing on BLOB and TEXT columns. For example:

    CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
    La clé primaire est un index et à cause de la nature des index (on ne peut indexer que sur une longueur fixe), il faut préciser quelle portion gauche de la colonne TEXT doit être indexée.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Points : 113
    Points
    113
    Par défaut
    Merci.

    Voici le code qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `hardware` (
        `serial_hw` TINYTEXT not null,
        `brand_hw` TINYTEXT,
        `model_hw` TINYTEXT,
        `desc_hw` TINYTEXT,
        `cost_hw` FLOAT,
        `weight_hw` FLOAT,
        PRIMARY KEY  (`serial_hw`(30))
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1;

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Points : 113
    Points
    113
    Par défaut
    Plus compliqué, une table qui possède une clef étrangère sous forme de TINYTEXT.
    Le code expliquera mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DROP TABLE IF EXISTS `flightcase_hardware`;
    CREATE TABLE `flightcase_hardware` 
    (
        `id_flight` INT NOT NULL,
        `serial_hw` TINYTEXT NOT NULL,
        `date_of` DATETIME,
        PRIMARY KEY  (`id_flight`,`serial_hw`(30)),
        KEY `idx_idflight` (`id_flight`),
        KEY `idx_serialhw` (`serial_hw`(30)),
        FOREIGN KEY (`id_flight`) REFERENCES `flightcase` (`id_flight`),
        FOREIGN KEY (`serial_hw`(30)) REFERENCES `hardware` (`serial_hw`)
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1;
    me génère ette erreur:
    #1005 - Can't create table './project/flightcase_hardware.frm' (errno: 150)
    qui signifie une erreur dans les clefs étrangères.

    Je tourne mais je ne trouve pas la solution...

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Points : 113
    Points
    113
    Par défaut
    J'ai bien trouvé une solution :
    Index prefixes on foreign key columns are not supported. One consequence of this is that BLOB and TEXT columns cannot be included in a foreign key, because indexes on those columns must always include a prefix length.

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Pourquoi ne pas adopter un VARCHAR plutôt qu'un TINYTEXT ?

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Points : 113
    Points
    113
    Par défaut
    Ah ben maintenant que tu le dis...
    Je n'y avais pas pensé, il n'y a pas de retour à la lignr dans un numéro de série !

    Je vais le refaire comme ça ! Ca tombe bien je venais de refaire ma base avec un id_ en plus

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

Discussions similaires

  1. [AC-2003] Creation d'une table avec un index
    Par buzz73 dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/08/2009, 12h24
  2. Réponses: 1
    Dernier message: 27/07/2009, 17h11
  3. Conseil sur la creation d'une table
    Par rohrim dans le forum Administration
    Réponses: 4
    Dernier message: 08/06/2007, 13h19
  4. Réponses: 8
    Dernier message: 26/09/2005, 23h06
  5. Réponses: 2
    Dernier message: 02/11/2004, 13h38

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