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 :

Problème clé étrangère


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut Problème clé étrangère
    Bonjour,

    Je souhaite créer une base toute simple avec mysql (avec EasyPHP 2.6.1)...

    Voilà ce que je fais :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    -- Table Immeuble
     
    CREATE TABLE Immeuble
    (
     nomImm VARCHAR(15) NOT NULL,
     adresse VARCHAR(50) NOT NULL,
     nbEtages TINYINT,
     anneeConstruction SMALLINT, 
     nomGerant VARCHAR(15) NOT NULL,
     PRIMARY KEY(nomImm)
    )ENGINE=InnoDB;
     
    -- Table Appart
     
    CREATE TABLE Appart
    (
     nomImm VARCHAR(15) NOT NULL,
     noApp TINYINT NOT NULL,
     superficie SMALLINT,
     etage TINYINT,
     PRIMARY KEY (nomImm, noApp),
     FOREIGN KEY (nomImm) REFERENCES Immeuble( nomImm ) ON DELETE CASCADE
    )ENGINE=InnoDB;
     
     
    -- Table Personne
     
    CREATE TABLE Personne
    (
     nom VARCHAR(15) NOT NULL,
     age TINYINT,
     profession VARCHAR(15) NOT NULL,
     PRIMARY KEY (nom)
    )ENGINE=InnoDB;
     
     
    -- Table Occupant
     
    CREATE TABLE Occupant
    (
     nomImm VARCHAR(15) NOT NULL,
     noApp TINYINT NOT NULL,
     nomOcc VARCHAR(15) NOT NULL, 
     anneeArrivee SMALLINT,
     
     PRIMARY KEY (nomImm, noApp, nomOcc), 
     
     FOREIGN KEY (nomImm) REFERENCES Immeuble( nomImm ) ON DELETE CASCADE,
     FOREIGN KEY (nomOcc) REFERENCES Personne( nom ) ON DELETE CASCADE,
     FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
    )ENGINE=InnoDB;
    Tout marche, sauf la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
    J'ai beau la mettre avant, après rien n'y fait !!
    Les 2 autres lignes précédentes fonctionnent, mais celle-ci non !!!
    L'erreur retournée est
    MySQL a répondu:
    #1005 - Ne peut cr�er la table '.\dbimmeubles\occupant.frm' (Errcode: 150)
    Je comprends vraiment pas pourquoi !!!


    En fait j'ai l'impression que mysql ne reconnait pas la table Appart car si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOREIGN KEY (noApp) REFERENCES Appart( bidule ) ON DELETE CASCADE
    ça me renvoie la même erreur !!

    Help !

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2005
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 185
    Par défaut
    Slt , qu'est ce qui se passe lorsque tu supprimes cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
    ?

  3. #3
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Salut !!

    Eh bah ça marche justement !
    Mais ça m'embête car je voudrais bien mettre la contrainte de clé étrangère quand même !!

  4. #4
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Citation Envoyé par Aide MySQL
    Les deux tables doivent être de type InnoDB, dans la table, il doit y avoir un INDEX où les clés étrangères sont listées comme première colonne, dans le même ordre, et dans la table référencée, il doit y avoir un INDEX où les colonnes référencées sont listées comme premières colonnes, dans le même ordre...

    InnoDB ne crée pas automatiquement les index nécessaires pour les clés étrangères : vous devez ls créer vous-même

    Les index en question sont-ils crées ?

    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
    CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
                          price DECIMAL,
                          PRIMARY KEY(category, id)) TYPE=INNODB;
    CREATE TABLE customer (id INT NOT NULL,
                          PRIMARY KEY (id)) TYPE=INNODB;
    CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
                          product_category INT NOT NULL,
                          product_id INT NOT NULL,
                          customer_id INT NOT NULL,
                          PRIMARY KEY(no),
                          INDEX (product_category, product_id),             <<<<---- ici
                          FOREIGN KEY (product_category, product_id)
                            REFERENCES product(category, id)
                            ON UPDATE CASCADE ON DELETE RESTRICT,
                          INDEX (customer_id),                              <<<<---- et ici   
                          FOREIGN KEY (customer_id)
                            REFERENCES customer(id)) TYPE=INNODB;

  5. #5
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Non !!
    Je teste ça ce soir...

    Mais pourquoi ça marche sur les autres clés étrangères où je n'ai pas fait d'index, et pas sur cette clé venant de "Appart" ?? C'est ça que je ne comprends pas bien...

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Mais pourquoi ça marche sur les autres clés étrangères où je n'ai pas fait d'index
    Il me semble que, quand on déclare une Primary Key, MySQL créé automatiquement l'index corespondant...

    Or, dans ton cas NoAppart n'est pas une PK

    Quand à l'index résultant de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRIMARY KEY (nomImm, noApp),
    il ne peut convenir car
    Citation Envoyé par Aide MySQL
    il doit y avoir un INDEX où les clés étrangères sont listées comme première colonne,
    hélas, noAppart est en 2nd 8)

  7. #7
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    ça marche !!


    Et oui j'ai compris !

    Merci pour l'explication !!

    A+

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/01/2011, 14h53
  2. Problème clé étrangère.
    Par damien77 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/04/2008, 18h21
  3. Problèmes clés étrangères
    Par romaix21 dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 11h46
  4. problème clé étrangère en null
    Par maysa dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 24/08/2004, 12h22
  5. [SQL SERVER 2000] Problème clef étrangére
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/05/2004, 10h44

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