Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/08/2006, 12h43   #1
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
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:
Citation:
#1170 - BLOB/TEXT column 'serial_hw' used in key specification without a key length
Voici mon code:
Code :
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é:
Citation:
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
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 14h37   #2
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Salut,

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

Citation:
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.
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 16h32   #3
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
Merci.

Voici le code qui marche:
Code :
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;
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 18h04   #4
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
Plus compliqué, une table qui possède une clef étrangère sous forme de TINYTEXT.
Le code expliquera mieux:
Code :
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:
Citation:
#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...
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 18h11   #5
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
J'ai bien trouvé une solution :
Citation:
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.
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 18h38   #6
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Pourquoi ne pas adopter un VARCHAR plutôt qu'un TINYTEXT ?
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2006, 19h03   #7
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
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
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h37.


 
 
 
 
Partenaires

Hébergement Web