{MySQL} Pb lors de la création d'une table MySQL

Résolu/Fermé
kanbur - 9 juin 2009 à 11:10
 kanbur - 9 juin 2009 à 15:54
Bonjour,

Je n'arrive pas à comprendre pourquoi mysql m'envoie ce message d'erreur lors de la création de la table BATIMENT :
"ERROR 1072 (42000): Key column 'CATEGORY_ID' doesn't exist in table"

Voici mon code MySQL de création des deux tables :

create table CATEGORY
(
CATEGORY_ID integer not null auto_increment,
Category_Name varchar(100) binary not null,
Category_Description varchar(250) binary,
primary key (CATEGORY_ID),
unique (CATEGORY_ID,Category_Name)
) ENGINE = InnoDB;

create table BATIMENT
(
BATIMENT_ID integer not null auto_increment,
Batiment_Name varchar(100) binary not null,
Batiment_Description varchar(200) binary,
primary key (BATIMENT_ID),
unique (BATIMENT_ID,Batiment_Name),
INDEX (CATEGORY_ID),
FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORY (CATEGORY_ID) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB;

**************************************************
Pourtant la création de la table CATEGORY s'effectue correctement. L'appercu des champs de cette table est correct :
mysql> SHOW COLUMNS FROM CATEGORY ;
+----------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+--------------+------+-----+---------+----------------+
| CATEGORY_ID | int(11) | NO | PRI | NULL | auto_increment |
| Category_Name | varchar(100) | NO | | | |
| Category_Description | varchar(250) | YES | | NULL | |
+----------------------+--------------+------+-----+---------+----------------+
A voir également:

6 réponses

wjaouadi Messages postés 25 Date d'inscription vendredi 13 mars 2009 Statut Contributeur Dernière intervention 25 décembre 2009 160
9 juin 2009 à 11:26
Bonjour,
je commence par les remarques :
-il est inutile de signaler au niveau de la table CATEGORY que CATEGORY_ID est unique étant donné que c'est une clé primaire.
-même remarque que précedemment pour la table BATIMENT et la clé primaire BATIMENT_ID
-même remarque pour la contrainte not null qui est implicite dans le cas des clé primaires.
-je n'ai pas compris le but de l'utilisation de index(CATEGORY_ID) ???

Pour le problème il est du à la non déclaration du champs CATEGORY_ID dans la table BATIMENT .
Essaye ça :
create table BATIMENT
(
BATIMENT_ID integer auto_increment,
Batiment_Name varchar(100) binary not null unique,
Batiment_Description varchar(200) binary,
CATEGORY_ID integer,
Constraint pk_batiment primary key (BATIMENT_ID),
FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORY (CATEGORY_ID) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB;
2
wjaouadi Messages postés 25 Date d'inscription vendredi 13 mars 2009 Statut Contributeur Dernière intervention 25 décembre 2009 160
9 juin 2009 à 15:23
re Bonjour,
Oui c'est ça.
1
Dans la table "BATIMENT", en ajoutant la ligne "CATEGORY_ID integer not null," avant "INDEX (CATEGORY_ID)" je n'obtiens plus d'erreur.
0
Merci bcp wjaouadi. Précédemment, j'étais en train de m'apporter une réponse au même moment que toi.
Tes précisions sur mes lignes inutiles vont bien m'aider pour mieux coder.
Concernant le but de l'utilisation de index(CATEGORY_ID), en fait j'ai lu que l'ajout d'INDEX est pertinent sur :
- les champs utilisés pour les clés étrangères (ON ... = ...)
- les champs sur lesquels des tris sont très souvent utilisés (ORDER BY ...)
- les champs sur lesquels des filtres sont très souvent utilisés (WHERE ...)
alors je me suis dis que quand on déclare une clé étrangère, il vaut mieux créer un index pour accélérer les requêtes de lecture de la table mais je dois me tromper. Est-ce que je peux avoir ton avis dessus ?
0
wjaouadi Messages postés 25 Date d'inscription vendredi 13 mars 2009 Statut Contributeur Dernière intervention 25 décembre 2009 160
9 juin 2009 à 12:16
re bonjour,
Ton idée de générer des index sur les clé étrangère n'est pas fausse mais vaux mieux faire une séparation et gérer les index à part selon le besoin. Essayer de trop optimiser peu ralentir des fois.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ah d'accord et je gère séparément les index en ajoutant ce genre de lignes suivant les lectures que j'aurais à faire dans les tables de ma base :
mysql> ALTER BATIMENT ADD INDEX(CATEGORY_ID);
C'est ca ?
0
MERCI !
0