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

Requêtes MySQL Discussion :

MySQL 5 - #1005 - Can't create table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Par défaut MySQL 5 - #1005 - Can't create table
    Bonjour,

    J'utilise MySQL Workbench et lorsque j'exécute mes instructions DDL j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1005 - Can't create table './products.frm' (errno: 121)
    Ci-dessous une description de mes tables (categories, sections, products) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE  TABLE IF NOT EXISTS `categories` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
      `name` VARCHAR(80) NOT NULL ,
      PRIMARY KEY (`id`) )
    ENGINE = InnoDB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE  TABLE IF NOT EXISTS `sections` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
      `category_id` INT UNSIGNED NOT NULL ,
      `name` VARCHAR(80) NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX `fk_categories` (`category_id` ASC) ,
      CONSTRAINT `fk_categories`
        FOREIGN KEY (`category_id` )
        REFERENCES `categories` (`id` )
        ON DELETE CASCADE
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    CREATE  TABLE IF NOT EXISTS `products` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
      `category_id` INT UNSIGNED NOT NULL ,
      `section_id` INT UNSIGNED NOT NULL ,
      `created_at` DATETIME NOT NULL ,
      `label` VARCHAR(100) NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX `fk_categories` (`category_id` ASC) ,
      INDEX `fk_sections` (`section_id` ASC) ,
      CONSTRAINT `fk_categories`
        FOREIGN KEY (`category_id` )
        REFERENCES `categories` (`id` )
        ON DELETE CASCADE
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_sections`
        FOREIGN KEY (`section_id` )
        REFERENCES `sections` (`id` )
        ON DELETE CASCADE
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    J'ai parcouru plusieurs forums et ce problème survient généralement lorsque le type de la clé de référence et celui de la clé étrangère sont différents. Malheureusement pour moi, il ne s'agit pas de ça. J'ai peut être mal organisé/conçu mes tables.

    Quelqu'un a-t-il déjà eu ce problème ou dans le meilleur des cas sait comment le résoudre ?

    D'avance merci pour votre aide,

    Yvan

  2. #2
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Par défaut
    J'ai beau supprimer les indexes, renommer les contraintes, rien n'y fait, l'erreur est toujours là !

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Bien entendu, les tables sont créées dans le bon ordre : categories puis section puis products ?

    Puisqu'une section est rattachée à une catégorie, il me semble inutile de mettre la clé étrangère catégory_id dans la table products.
    Si je supprime cette clé étrangère, la création de la table fonctionne.
    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 !

  4. #4
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Par défaut
    Puisqu'une section est rattachée à une catégorie, il me semble inutile de mettre la clé étrangère catégory_id dans la table products.
    Oui, la présence de la colonne CATEGORY_ID est discutable. Je l'avais ajouté pour pouvoir localiser plus rapidement mon enregistrement PRODUCT (évite les jointures). C'est une pratique que j'ai toujours appliqué, peut-être que je me trompe...
    Oui tu te trompes !
    Tu crées une redondance de données inutile et qui peut entraîner des incohérences telles que l'affectation à un produit d'une catégorie non rattachée à la section du produit.
    Il ne faut pas avoir peur des jointures, les SGBDR sont fait pour ça.
    Et comme tu as correctement indexé tes tables, tu ne devrais pas rencontrer de soucis de performances avant plusieurs millions de produits répartis dans beaucoup de sections pour pas mal de catégories.

    Pour résoudre ce problème, j'ai tenté de simplifier au maximum mes requêtes (pas forcément les meilleures optimisations),

    Et là comme par magie tout fonctionne. Peut être qu'un indexe ne supporte pas le type UNSIGNED. J'ai fouillé sur la doc MySQL et ça ne semble pas être ça.
    Euh... non, je n'ai jamais eu de problème avec UNSIGNED que j'ai utilisé pourtant plusieurs fois.
    Essaie de changer le type en UNSIGNED maintenant pour voir ?

    Quoique je trouve ça bizarre sur le plan du fonctionnement du SGBD, je pense que la suppression de la clé étrangère uniquement suffise à résoudre le problème efficacement.

Discussions similaires

  1. #1005 - Can't create table (errno: 150)
    Par teophane dans le forum Requêtes
    Réponses: 6
    Dernier message: 05/12/2011, 09h53
  2. Réponses: 9
    Dernier message: 06/12/2010, 15h52
  3. #1005 - Can't create table (errno: 121)
    Par onizuka_metal dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/06/2010, 16h52
  4. #1005 - Can't create table 'test.items' (errno: 150)
    Par billyrose dans le forum Débuter
    Réponses: 2
    Dernier message: 04/06/2009, 11h05
  5. Réponses: 1
    Dernier message: 28/08/2008, 09h33

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