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 :

Clés étrangères - InnoDB


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Clés étrangères - InnoDB
    Bonjour,

    Je dois développer une application dont l'objectif est de générer des documents à partir d'une base de données complétée.

    Cependant, je suis confronté à un cas de figure qui me bloque et qui se répète pour beaucoup de tables : l'utilisation de clés étrangères pour plusieurs champs pointant vers le champ ID d'une autre table.

    Voici un diagramme expliquant la situation :



    Voici le type de requête qui me bloque et qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE Table1
    (
    id INTEGER,
    champ1 INTEGER,
    champ2 INTEGER
    );
     
    CREATE TABLE Table2
    (
    id INTEGER UNIQUE,
    ... INTEGER
    );
     
    ALTER TABLE Table1 ADD FOREIGN KEY (champ1,champ2) REFERENCES Table2 (id,id) ON DELETE CASCADE;
    Pourriez-vous m'expliquer comment procéder, j'ai lu la doc de InnoDB sur le site officiel mais cela ne m'aide pas, je n'y arrive pas !

    Merci d'avance,
    Cordialement,

    Weeky

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Plusieurs champs d'une même table pointent sur le même champ ID d'une même autre table ?
    Il y a un problème de conception, là.
    Normalement, un champ pointe sur un champ d'une autre table par le biais de la clé étrangère...

    J'avoue ne pas bien comprendre ce que vous souhaitez faire exactement...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre réponse,

    Je ne suis pas assez précis, j'espère que ce schéma-ci vous aidera d'avantage à comprendre mon problème :



    Le code est le suivant :

    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
    CREATE TABLE table
    (
    id INTEGER,
    champ1 INTEGER,
    champ2 INTEGER
    );
     
    CREATE TABLE type
    (
    id INTEGER UNIQUE,
    category_id INTEGER NOT NULL,
    is_activated BOOLEAN DEFAULT false NOT NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL
    );
     
    CREATE TABLE category
    (
    id INTEGER,
    name VARCHAR(255),
    description TEXT NOT NULL,
    is_activated BOOLEAN DEFAULT false NOT NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL
    );
     
    ALTER TABLE table ADD FOREIGN KEY (champ1,champ2) REFERENCES type (id,id);
     
    ALTER TABLE type ADD FOREIGN KEY (category_id) REFERENCES category (id);
    Par exemple, le champ "champ1" doit avoir l'identifiant du champ "id" de la table type pour une certaine "categorie" de la table category. De même, le champ "champ2" doit avoir l'identifiant du champ "id" de la table type pour une autre catégorie.

    En espérant que ce soit plus clair,

    Merci d'avance,
    Cordialement,

    Weeky

  4. #4
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonsoir,

    Difficile de manipuler des notions aussi vagues que "champ1", "table", "type", etc, mais je pense que vous devez simplement créer des tables jointures.

    Si l'on devait remonter au niveau d'un MCD Merisien vous auriez ceci:
    Type -1,1----------(Appartient)-------------0,N- Category
    Table -0,1----------(Association1)-----------0,N- Type
    Table -0,1----------(Association2)-----------0,N- Type

    Au niveau physique.
    La table "Table" n'aura pas de clé étrangères (vos "champ1" et "champ2").
    Vous aurez deux tables supplémentaires comme ceci (clé primaire soulignées, clé étrangères en italique):
    Association1(tableId, typeId)
    Association2(tableId, typeId)

    Citation Envoyé par Weeky Voir le message
    Par exemple, le champ "champ1" doit avoir l'identifiant du champ "id" de la table type pour une certaine "categorie" de la table category. De même, le champ "champ2" doit avoir l'identifiant du champ "id" de la table type pour une autre catégorie.
    Concernant ces contraintes.
    Vous devrez les appliquer en utilisant des Triggers ou contrainte Check.
    Par exemple:
    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
    CREATE TABLE Association1 (
      tableId integer NOT NULL,
      typeId  integer NOT NULL,
      CONSTRAINT pk_Association1 PRIMARY KEY (tableId),
      CONSTRAINT fk_Association1_table FOREIGN KEY (tableId)
        REFERENCES Table(id),
      CONSTRAINT fk_Association1_type FOREIGN KEY (typeId)
        REFERENCES Type(id),
      CONSTRAINT ck_typeAssoc CHECK (
        typeId IN (
          SELECT id
          FROM Type
          WHERE category_id = 13319
        )
      )
    );

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/10/2009, 16h26
  2. Réponses: 1
    Dernier message: 20/05/2008, 18h08
  3. InnoDB et clés étrangères chez wanadoo...
    Par manuunam dans le forum Outils
    Réponses: 9
    Dernier message: 03/06/2005, 11h29
  4. compréhension fonctionnement clés étrangères innoDB
    Par halina dans le forum Requêtes
    Réponses: 8
    Dernier message: 11/05/2005, 10h36
  5. [Script]prob de clés étrangères
    Par Seb7 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/07/2003, 17h37

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