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

Langage SQL Discussion :

Table liée à une table à clé primaire multiple


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Table liée à une table à clé primaire multiple
    Bonjour,

    Je n'arrive pas à lier correctement une table CHOIX à une table DONNEES par une relation 1,1 --> 0,n. La table DONNEES possède une clé primaire multiple qui est la concaténation de 4 champs (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) :
    Lorsque je visualise les colonnes de la table CHOIX, seul le champs FORME_ID est détecté comme étant une clé étrangère. CHAMPS_1_ID, CHAMPS_2_ID, et CHAMPS_3_ID ne sont pas détectés comme clés étrangères.
    Apercu de la commande show columns from CHOIX; :
    +----------------------------+---------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +----------------------------+---------+------+-----+---------+----------------+
    | CHOIX_ID | int(11) | NO | PRI | NULL | auto_increment |
    | Donnees_Date_Start_Choisie | date | NO | | | |
    | Donnees_Date_End_Choisie | date | NO | | | |
    | FORME_ID | int(11) | NO | MUL | | |
    | CHAMPS_1_ID | int(11) | NO | | | |
    | CHAMPS_2_ID | int(11) | NO | | | |
    | CHAMPS_3_ID | int(11) | NO | | | |
    +----------------------------+---------+------+-----+---------+----------------+
    Est-ce que vous pouvez me dire ce qui cloche dans le code de création de la table CHOIX ci-dessous :
    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 CHOIX
    (
    CHOIX_ID integer auto_increment,
    Donnees_Date_Start_Choisie date not null,
    Donnees_Date_End_Choisie date not null,
    FORME_ID integer not null,
    CHAMPS_1_ID integer not null,
    CHAMPS_2_ID integer not null,
    CHAMPS_3_ID integer not null,
    primary key (CHOIX_ID),
    INDEX (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID),
    CONSTRAINT FK_DONNEES FOREIGN KEY (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) REFERENCES DONNEES (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;

    Table DONNEES lié à la table CHOIX
    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
    create table DONNEES
    (
    Donnees_Nom varchar(250) binary not null,
    Donnees_Date_Start date,
    Donnees_Date_End date,
    FORME_ID integer,
    CHAMPS_1_ID integer,
    CHAMPS_2_ID integer,
    CHAMPS_3_ID integer,
    FORME_CATEGORIE_ID integer not null,
    LOCAL_ID integer not null,
    primary key (FORME_ID,CHAMPS_1_ID,CHAMPS_2_ID,CHAMPS_3_ID),
    unique (Donnees_Nom),
    CONSTRAINT FK_FORME FOREIGN KEY (FORME_ID) REFERENCES FORME (FORME_ID) ON DELETE CASCADE,
    CONSTRAINT FK_CHAMPS_1 FOREIGN KEY (CHAMPS_1_ID) REFERENCES CHAMPS_1 (CHAMPS_1_ID) ON DELETE CASCADE,
    CONSTRAINT FK_CHAMPS_2 FOREIGN KEY (CHAMPS_2_ID) REFERENCES CHAMPS_2 (CHAMPS_2_ID) ON DELETE CASCADE,
    CONSTRAINT FK_CHAMPS_3 FOREIGN KEY (CHAMPS_3_ID) REFERENCES CHAMPS_3 (CHAMPS_3_ID) ON DELETE CASCADE,
    CONSTRAINT FK_FORME_CATEGORIEB FOREIGN KEY (FORME_CATEGORIE_ID) REFERENCES FORME_CATEGORIE (FORME_CATEGORIE_ID) ON DELETE CASCADE,
    CONSTRAINT FK_LOCAL FOREIGN KEY (LOCAL_ID) REFERENCES LOCAL (LOCAL_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;


    Tables permettant la création de la table DONNEES :
    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
    53
    54
    55
    56
    create table FORME_CATEGORIE
    (
    FORME_CATEGORIE_ID integer auto_increment,
    Forme_Categorie_Name varchar(2) binary not null,
    Forme_Categorie_Description varchar(250) binary,
    primary key (FORME_CATEGORIE_ID),
    unique (Forme_Categorie_Name)
    ) ENGINE = InnoDB;
     
    create table FORME
    (
    FORME_ID integer auto_increment,
    Forme_Name varchar(2) binary not null,
    Forme_Description varchar(250) binary,
    FORME_CATEGORIE_ID integer not null,
    primary key (FORME_ID),
    unique (Forme_Name),
    INDEX (FORME_CATEGORIE_ID),
    CONSTRAINT FK_FORME_CATEGORIEA FOREIGN KEY (FORME_CATEGORIE_ID) REFERENCES FORME_CATEGORIE (FORME_CATEGORIE_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
     
    create table LOCAL
    (
    LOCAL_ID integer auto_increment,
    Local_Name varchar(2) binary not null,
    Local_Description varchar(250) binary,
    primary key (LOCAL_ID),
    unique (Local_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_1
    (
    CHAMPS_1_ID integer auto_increment,
    Champ1_Name varchar(2) binary not null,
    Champ1_Description varchar(250) binary,
    primary key (CHAMPS_1_ID),
    unique (Champ1_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_2
    (
    CHAMPS_2_ID integer auto_increment,
    Champ2_Name varchar(2) binary not null,
    Champ2_Description varchar(250) binary,
    primary key (CHAMPS_2_ID),
    unique (Champ2_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_3
    (
    CHAMPS_3_ID integer auto_increment,
    Champ3_Name varchar(2) binary not null,
    Champ3_Description varchar(250) binary,
    primary key (CHAMPS_3_ID),
    unique (Champ3_Name)
    ) ENGINE = InnoDB;

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Ça se passe très bien avec SQL Server.

    Je ne connais pas votre SGBD, mais en autorisant NULL pour les colonnes de la clé primaire de la table DONNEES, vous autorisez le viol de l’intégrité d’entité : à corriger tout de suite.

    Je constate par ailleurs un viol de 2NF : la colonne FORME_CATEGORIE_ID n’a rien à faire dans la table DONNEES, puisque vous retrouvez la catégorie via la forme référencée par DONNEES (transitivité). Vous risquez de retrouver dans la table DONNEES une valeur de catégorie différente de celle que l’on retrouve via FORME (transitivité violée).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Table liée à une table à clé primaire multiple
    Bonjour fsmrel
    Tout d'abord un grand merci pour cette réponse car je sais bien que ma question est longue et nécessite du temps pour y répondre.
    Votre réponse va me permettre de mieux coder mais mon problème de départ est toujours présent.

    Alors concernant la remarque sur les clés primaires que je n'ai pas déclaré "not null",
    j'avais retiré cette contrainte à la suite d'une ancienne question sur un autre forum où on m'a dis texto "Pas besoin de mettre la contrainte non null, c'est une clé primaire donc la contrainte est implicite." Mais je vais quand même re-préciser cette contrainte car en effet elle est mise la plupart du temps sur les clés primaires. Ceci dis quand je fais un "show columns from", je vois que le SGBD a mis par défaut "not null" aux champs qui constituent la clé primaire multiple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    show columns from DONNEES;
    +--------------------+--------------+------+-----+---------+-------+
    | Field              | Type         | Null | Key | Default | Extra |
    +--------------------+--------------+------+-----+---------+-------+
    | Donnees_Nom        | varchar(250) | NO   | UNI |         |       | 
    | Donnees_Date_Start | date         | YES  |     | NULL    |       | 
    | Donnees_Date_End   | date         | YES  |     | NULL    |       | 
    | FORME_ID           | int(11)      | NO   | PRI | 0       |       | 
    | CHAMPS_1_ID        | int(11)      | NO   | PRI | 0       |       | 
    | CHAMPS_2_ID        | int(11)      | NO   | PRI | 0       |       | 
    | CHAMPS_3_ID        | int(11)      | NO   | PRI | 0       |       | 
    | FORME_CATEGORIE_ID | int(11)      | NO   | MUL |         |       | 
    | LOCAL_ID           | int(11)      | NO   | MUL |         |       | 
    +--------------------+--------------+------+-----+---------+-------+
    Mon SGBD est MySQL v5.0.45. Je crée mes tables en codant en MySQL.

    Concernant la 2eme remarque je ne savais pas que ce genre de double lien entraine une erreur, je viens de supprimer ce lien (DONNEES --> FORME_CATEGORIE).

    Mon grand problème de départ est toujours présent : Je ne vois qu'un seul champs sur les quatre formant la clé primaire multiple de la table DONNEES qui est détecté comme clé étrangère dans la table CHOIX. J'ai mis l'ensemble de mon code corrigé ci-dessous. Est-ce qu'il serait possible que vous copiez ce code sur votre MySQL et que vous voyez si un "show columns from CHOIX;" vous donne un résultat différent du mien et me copier la réponse que vous obtenez si elle est différente.
    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
    mysql> show columns from DONNEES;
    +--------------------+--------------+------+-----+---------+-------+
    | Field              | Type         | Null | Key | Default | Extra |
    +--------------------+--------------+------+-----+---------+-------+
    | Donnees_Nom        | varchar(250) | NO   | UNI |         |       | 
    | Donnees_Date_Start | date         | YES  |     | NULL    |       | 
    | Donnees_Date_End   | date         | YES  |     | NULL    |       | 
    | FORME_ID           | int(11)      | NO   | PRI |         |       | 
    | CHAMPS_1_ID        | int(11)      | NO   | PRI |         |       | 
    | CHAMPS_2_ID        | int(11)      | NO   | PRI |         |       | 
    | CHAMPS_3_ID        | int(11)      | NO   | PRI |         |       |
    | LOCAL_ID           | int(11)      | NO   | MUL |         |       | 
    +--------------------+--------------+------+-----+---------+-------+
    8 rows in set (0.00 sec)
     
    mysql> show columns from CHOIX;
    +----------------------------+---------+------+-----+---------+----------------+
    | Field                      | Type    | Null | Key | Default | Extra          |
    +----------------------------+---------+------+-----+---------+----------------+
    | CHOIX_ID                   | int(11) | NO   | PRI | NULL    | auto_increment | 
    | Donnees_Date_Start_Choisie | date    | NO   |     |         |                | 
    | Donnees_Date_End_Choisie   | date    | NO   |     |         |                | 
    | FORME_ID                   | int(11) | NO   | MUL |         |                | 
    | CHAMPS_1_ID                | int(11) | NO   |     |         |                | 
    | CHAMPS_2_ID                | int(11) | NO   |     |         |                | 
    | CHAMPS_3_ID                | int(11) | NO   |     |         |                |
    +----------------------------+---------+------+-----+---------+----------------+
    7 rows in set (0.00 sec)
     
    **********************************************************************************************
    Nouveau code des tables DONNEES et CHOIX :
    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
    create table DONNEES
    (
       Donnees_Nom varchar(250) binary not null,
       Donnees_Date_Start date,
       Donnees_Date_End date,
       FORME_ID integer not null,
       CHAMPS_1_ID integer not null,
       CHAMPS_2_ID integer not null,
       CHAMPS_3_ID integer not null,
       LOCAL_ID integer not null,
       primary key (FORME_ID,CHAMPS_1_ID,CHAMPS_2_ID,CHAMPS_3_ID),
       unique (Donnees_Nom),
       CONSTRAINT FK_FORME FOREIGN KEY (FORME_ID) REFERENCES FORME (FORME_ID) ON DELETE CASCADE,
       CONSTRAINT FK_CHAMPS_1 FOREIGN KEY (CHAMPS_1_ID) REFERENCES CHAMPS_1 (CHAMPS_1_ID) ON DELETE CASCADE,
       CONSTRAINT FK_CHAMPS_2 FOREIGN KEY (CHAMPS_2_ID) REFERENCES CHAMPS_2 (CHAMPS_2_ID) ON DELETE CASCADE,
       CONSTRAINT FK_CHAMPS_3 FOREIGN KEY (CHAMPS_3_ID) REFERENCES CHAMPS_3 (CHAMPS_3_ID) ON DELETE CASCADE,
       CONSTRAINT FK_LOCAL FOREIGN KEY (LOCAL_ID) REFERENCES LOCAL (LOCAL_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
     
    create table CHOIX
    (
       CHOIX_ID integer not null auto_increment,
       Donnees_Date_Start_Choisie date not null,
       Donnees_Date_End_Choisie date not null,
       FORME_ID integer not null,
       CHAMPS_1_ID integer not null,
       CHAMPS_2_ID integer not null,
       CHAMPS_3_ID integer not null,
       primary key (CHOIX_ID),
       INDEX (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID),
       CONSTRAINT FK_DONNEES FOREIGN KEY (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) REFERENCES DONNEES (FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
    **********************************************************************************************
    **********************************************************************************************
    Code des autres tables qui permette la création de la table DONNEES :
    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
    53
    54
    55
    56
    57
    create table FORME_CATEGORIE
    (
       FORME_CATEGORIE_ID integer not null auto_increment,
       Forme_Categorie_Name varchar(2) binary not null,
       Forme_Categorie_Description varchar(250) binary,
       primary key (FORME_CATEGORIE_ID),
       unique (Forme_Categorie_Name)
    ) ENGINE = InnoDB;
     
    create table FORME
    (
       FORME_ID integer not null auto_increment,
       Forme_Name varchar(2) binary not null,
       Forme_Description varchar(250) binary,
       FORME_CATEGORIE_ID integer not null,
       primary key (FORME_ID),
       unique (Forme_Name),
       INDEX (FORME_CATEGORIE_ID),
       CONSTRAINT FK_FORME_CATEGORIE FOREIGN KEY (FORME_CATEGORIE_ID) REFERENCES FORME_CATEGORIE (FORME_CATEGORIE_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
     
    create table LOCAL
    (
       LOCAL_ID integer not null auto_increment,
       Local_Name varchar(2) binary not null,
       Local_Description varchar(250) binary,
       primary key (LOCAL_ID),
       unique (Local_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_1
    (
       CHAMPS_1_ID integer not null auto_increment,
       Champ1_Name varchar(2) binary not null,
       Champ1_Description varchar(250) binary,
       primary key (CHAMPS_1_ID),
       unique (Champ1_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_2
    (
       CHAMPS_2_ID integer not null auto_increment,
       Champ2_Name varchar(2) binary not null,
       Champ2_Description varchar(250) binary,
       primary key (CHAMPS_2_ID),
       unique (Champ2_Name)
    ) ENGINE = InnoDB;
     
    create table CHAMPS_3
    (
       CHAMPS_3_ID integer not null auto_increment,
       Champ3_Name varchar(2) binary not null,
       Champ3_Description varchar(250) binary,
       primary key (CHAMPS_3_ID),
       unique (Champ3_Name)
    ) ENGINE = InnoDB;
    **********************************************************************************************

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour alter,


    Citation Envoyé par alter Voir le message
    "Pas besoin de mettre la contrainte non null, c'est une clé primaire donc la contrainte est implicite."
    Dans un sens c’est une bonne chose, car le terme « NULL » a été chassé du Relationland » (ou théorie relationnelle si vous préférez).
    En revanche, il pollue le SQLland où l’on trouve une langue officielle et des dialectes et il n’est pas dit que le jour où vous aurez à utiliser un SGBD autre que MySQL vous aurez à coder NOT NULL pour les colonnes composant la clé primaire.
    Mais au vu de ce que vous signalez et d’après le SHOW COLUMNS, l’absence de NOT NULL est a priori sans incidence avec MySQL.


    Citation Envoyé par alter Voir le message
    Concernant la 2eme remarque je ne savais pas que ce genre de double lien entraine une erreur, je viens de supprimer ce lien (DONNEES --> FORME_CATEGORIE).
    Il est des situations dans lesquelles ça pourrait ne pas être une erreur. En effet, on pourrait dire que via FORME, on retrouve la catégorie « officielle » pour une donnée et via le lien que vous mentionnez la catégorie « officieuse » pour cette donnée. Mais si cette dernière n’a pas lieu d’être, il est évident que supprimer le lien s’impose.


    Il serait opportun d’utiliser la balise « code » pour rendre plus confortable la lecture de vos tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    | Field       | Type         | Null | Key | Default | Extra |
     
    | Donnees_Nom | varchar(250) | NO   | UNI |         |       | 
    | Date_Start  | date         | YES  |     | NULL    |       | 
    | Date_End    | date         | YES  |     | NULL    |       | 
    | FORME_ID    | int(11)      | NO   | PRI |         |       |  
    | CHAMPS_1_ID | int(11)      | NO   | PRI |         |       |
    | CHAMPS_2_ID | int(11)      | NO   | PRI |         |       | 
    | CHAMPS_3_ID | int(11)      | NO   | PRI |         |       |
    | LOCAL_ID    | int(11)      | NO   | MUL |         |       |


    Citation Envoyé par alter Voir le message
    Est-ce qu'il serait possible que vous copiez ce code sur votre MySQL
    Je voudrais bien, mais... je n’ai pas MySQL Maintenant, vu vos tableaux, la colonne « Key » ne concerne pas les clés étrangères. C’est ce que confirme http://dev.mysql.com/doc/refman/5.0/...w-columns.html qui ne fait absolument pas mention des clés étrangères.

    => Pour vous assurez que la contrainte référentielle entre CHOIX et DONNEES est respectée, essayez de la violer pour voir la réaction du SGBD. Regardez aussi s'il existe une commande du genre SHOW donnant la liste des clés étrangères.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    La norme SQL prévoit un certain nombre de vues "système" et je constate que MySQL s'y conforme.

    En ce qui concerne les clés étrangères, voir par exemple http://dev.mysql.com/doc/refman/5.1/...nts-table.html pour la vue INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Table liée à une table à clé primaire multiple
    Tout d'abord un grand MERCI !
    T'es le meilleur !
    Grace à toi, j'ai enfin vu mon erreur : c'est d'avoir mal interprété la commande "show columns" parce que... je n'avais pas d'erreur sur cette fameuse clé étrangère multiple.
    (Au passage, j'ai pu apprendre à coder un peu mieux. )

    Citation Envoyé par fsmrel Voir le message
    La norme SQL prévoit un certain nombre de vues "système" et je constate que MySQL s'y conforme.

    En ce qui concerne les clés étrangères, voir par exemple http://dev.mysql.com/doc/refman/5.1/...nts-table.html pour la vue INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.
    --> En effet ce lien m'a été très utile. J'ai vu que, comme j'ai MySQL 5.0, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS n'existe pas MAIS il y a information_schema.KEY_COLUMN_USAGE http://dev.mysql.com/doc/refman/5.0/...age-table.html et accessoirement information_schema.tables. OUFFFF je vais aller me défouler maintenant .

    Euh sinon
    Citation Envoyé par fsmrel Voir le message
    => Pour vous assurez que la contrainte référentielle entre CHOIX et DONNEES est respectée, essayez de la violer pour voir la réaction du SGBD. Regardez aussi s'il existe une commande du genre SHOW donnant la liste des clés étrangères.
    Je ne sais pas comment on peut essayer de violer la contrainte référentielle, est-ce que tu as un exemple de commande ?

    Citation Envoyé par fsmrel Voir le message
    Il est des situations dans lesquelles ça pourrait ne pas être une erreur. En effet, on pourrait dire que via FORME, on retrouve la catégorie « officielle » pour une donnée et via le lien que vous mentionnez la catégorie « officieuse » pour cette donnée. Mais si cette dernière n’a pas lieu d’être, il est évident que supprimer le lien s’impose.
    En fait j'ai créé ce lien DONNEES --> FORME_CATEGORIE pour que, sur mon futur site internet, j'obtienne une liste de Donnees (dans un menu Donnees) aprés avoir choisi une "Categorie de Forme" (dans un menu Forme_Categorie qui les listes toutes). (Pour info, une Donnees est une [forme] + [trois champs qui apportent des elmts distinctifs])
    Et j'ai besoin du lien de la table FORME vers la table parent FORME_CATEGORIE pour lister toute les formes et les associer à une Categorie de Forme.
    Ce lien DONNEES --> FORME_CATEGORIE est-il inutile Docteur ? Cela est ma dernière question.

    BON WE (je pense que tu pourras me répondre lundi si tu peux)

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par alter Voir le message
    Je ne sais pas comment on peut essayer de violer la contrainte référentielle, est-ce que tu as un exemple de commande ?
    Insérer dans les colonnes FORME_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID de la table CHOIX des valeurs absentes des colonnes correspondantes de la table DONNEES :
    INSERT INTO CHOIX VALUES ( ... ) ;

    Citation Envoyé par alter Voir le message
    Ce lien DONNEES --> FORME_CATEGORIE est-il inutile Docteur ?
    Oui. Tel que les tables sont définies, une donnée fait nécessairement référence à une forme, laquelle fait nécessairement référence à une catégorie.
    Donc pour connaître la catégorie d’une donnée nommée « blabla » :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  Forme_Categorie_Name  
    FROM    DONNEES AS x INNER JOIN FORME AS y
              ON x.FORME_ID = y.FORME_ID
                         INNER JOIN FORME_CATEGORIE AS z
              ON y.FORME_CATEGORIE_ID = z.FORME_CATEGORIE_ID
    WHERE   x.Donnees_Nom = 'blabla'

    De la jointure on peut du reste faire une vue :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW V1 AS
    SELECT  x.Donnees_Nom, z.Forme_Categorie_Name  
    FROM    DONNEES AS x INNER JOIN FORME AS y
              ON x.FORME_ID = y.FORME_ID
                         INNER JOIN FORME_CATEGORIE AS z
              ON y.FORME_CATEGORIE_ID = z.FORME_CATEGORIE_ID ;

    Et pour retrouver la catégorie :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Forme_Categorie_Name
    FROM   V1
    WHERE  Donnees_Nom = 'blabla'

    Voilà. Bon week-end aussi.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Table liée à une table à clé primaire multiple
    Encore un énorme MERCI pour toutes ces infos qui m'aident beaucoup. Tiens je trinque virtuellement pour fêter ça !

    Bonne journée

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Faites seulement
    A la bonne vôtre alter,

    Si vous avez d'autres problèmes, n'hésitez pas, on saura peut-être les traiter et avoir ainsi l'occasion de trinquer à nouveau...

    fsmrel
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Dans un sens c’est une bonne chose, car le terme « NULL » a été chassé du Relationland » (ou théorie relationnelle si vous préférez).
    En revanche, il pollue le SQLland où l’on trouve une langue officielle et des dialectes et il n’est pas dit que le jour où vous aurez à utiliser un SGBD autre que MySQL vous aurez à coder NOT NULL pour les colonnes composant la clé primaire.
    En fait fsmrel, la norme SQL précise que la non NULLité des colonnes composant la clef primaire l'emporte systématiquement pour toute création de clef primaire. C'est donc le cas de la majorité des SGBDR, même si l'écriture est bizarre et me fait pousser des boutons !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  2. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  3. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  4. Réponses: 2
    Dernier message: 03/03/2007, 19h03
  5. Passage d'une sous-sous-table a une table liée
    Par le_gueux dans le forum 4D
    Réponses: 16
    Dernier message: 31/07/2006, 10h10

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