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 :

[Débutant] Problème de clé étrangère


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Débutant] Problème de clé étrangère
    Bonjour,

    Je débute en SQL, j'ai suivi et consulté des cours sur les base de données en SQL.

    Je souhaite créer des associations entre tables, pour cela, j'ai défini une clé primaire dans une table,
    dans une autre table, j'essaie de définir les clés étrangères qui seront liées à la première.

    J'ai une table 'sites' avec 5 colonnes : 'n°com', 'segmentation', 'n°codex', 'montant', 'adresse'
    et une autre 'installation' avec 1 colonne : 'catégorie'

    J'ai ajouté la PK après la création des tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Alter table sites
    add primary key (adresse);
    Puis la clé étrangère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE installation
    ADD CONSTRAINT fk_installation FOREIGN KEY catégorie REFERENCES sites(adresse);
    et MySQL me renvoie:

    #1064 - Erreur de syntaxe près de 'REFERENCES sites(adresse)' à la ligne 2
    Je ne vois pas où est l'erreur de syntaxe.

    PS: comment insère-t-on des lignes de code dans une fenêtre de message pour faciliter le C/C des lecteurs?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Avant de créer les tables, il faut d'abord s'assurer d'avoir les bonnes règles de gestion, quelles sont elles ?

    Par exemple
    R001 : un site peut faire l'objet de zéro à plusieurs installations
    R002 : une installation concerne un et un seul site

    Ou bien (moins probable)
    R001 : un site peut faire l'objet de zéro à plusieurs installations
    R002 : une installation concerne un à plusieurs sites

    Selon le cas, la modélisation n'est pas la même, et les tables résultantes non plus

    Vu que vous n'avez créé que deux tables, je suppose que la réponse est "R002 : une installation concerne un et un seul site"

    Ensuite, si vous voulez éviter les erreurs, vous devriez avoir le même nom de colonne dans toutes les tables où une clef étrangère est propagée : reprenez le même nom que celui de la table où cette colonne est l'identifiant primaire.

    Enfin, comme vous ne communiquez pas la description de vos colonnes, on ne sait pas ce qu'il en est réellement, mais assurez vous d'avoir utilisé les bons types pour les colonnes PK, c'est à dire de préférence de l'integer (small, integer, bigint) et surtout pas du char ou varchar.

    Dans votre cas, la modélisation pourrait être

    Au niveau conceptuel (MCD) :
    INSTALLATION (INS_id, INS_nom...) 1,1 --- concerner --- 0,n SITE(SIT_id, SIT_COD, SIT_NOM...)

    Au niveau logique (MLD), cela donne :
    Table INSTALLATION (INS_id integer PK, INS_nom varchar(100), ..., SIT_id integer FK references SITE(SIT_id))
    Table SITE (SIT_id integer PK, SIT_COD char(5), SIT_NOM varchar(80)...)

    Pour encadrer le code, utilisez la balise code (signe dièse # de la barre d'outils)

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    j'ai oublié de préciser que je suis sur phpmyadmin

    voici les tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table sites(
    n°COM VARCHAR(1024),
    segmentation varchar(1024),
    n°codes varchar(1024),montant varchar(1024),
    adresse varchar(1024));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table installation(
    installation VARCHAR(1024));
    puis j'ai rajouté la PK:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table sites
    add constraint primary key (adresse)
    et enfin la FK:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table installation
    add fk_catégorie foreign key (catégorie) references sites(adresse)
    il me renvoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - Erreur de syntaxe près de 'foreign key (catégorie) references sites(adresse)' à la ligne 2

  4. #4
    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
    La syntaxe est plutôt la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table nom_table
    add foreign key nom_fk (colonne) references nom_table_ref (nom_col_ref)
    Mais auparavant, comme vous le suggère à juste titre escartefigue, il vous faut revoir votre modélisation.
    Une adresse de type textuel en clé primaire d'une table, ça n'a pas de sens...

    Autre chose : éviter les accents et caractères spéciaux (comme "°") dans les noms de tables et de colonnes.
    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

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    lorsqu'on définit une PK c'est obligatoirement un nombre?
    par rapport au caractère spéciaux, je l'ai en tête,
    mais je pensais que pour nommer des tables, ce n'était pas préjudiciable

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par hypnor Voir le message
    lorsqu'on définit une PK c'est obligatoirement un nombre?
    Obligatoirement non, mais c'est très fortement recommandé

    Citation Envoyé par hypnor Voir le message
    par rapport au caractère spéciaux, je l'ai en tête,
    mais je pensais que pour nommer des tables, ce n'était pas préjudiciable
    c'est à minima embêtant, car ça complique la syntaxe des requêtes (antiquotes obligatoires), ca peut aussi gêner pour la portabilité du DDL. C'est vrai pour le nom des tables mais aussi des colonnes et de tous les objets de la BDD (vues, triggers, procédures stockées...)

    Si vous voulez poser des questions sur la modélisation des bases de données, et il semble que ce soit nécessaire, la section qui va bien se trouve ici :
    https://www.developpez.net/forums/f6...sation/schema/

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pour comprendre pourquoi la clé primaire recommandée est entière, lisez l'article de SQLPro sur les clés auto-incrémentées.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par hypnor
    Je souhaite créer des associations entre tables
    Autrement dit, vous avez deux tables "site" et "installation" (inutile de mettre les noms des tables au pluriel) et vous desirez définir une association.
    Vu le peu d'information que vous nous communiquez, on ne sait pas si c'est une relation hierarchique que vous avez entre vos deux tables, ou si une relation d'association.

    Selon votre exemple, il semble que cela soit une relation hiérarchique.
    Voici ce que je propose pour ce type de relation :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `site`
    --------------
     
    --------------
    CREATE TABLE `site`
    ( `id`            integer unsigned  not null auto_increment primary key,
      `segmentation`  varchar(255)      not null,
      `codex`         varchar(255)      not null,
      `montant`       decimal(15,2)     not null,
      `adresse`       varchar(255)      not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `site` (`segmentation`,`codex`,`montant`,`adresse`) VALUES
      ('seg 01', 'codex 01', 100.00, 'adresse 01'),
      ('seg 02', 'codex 02', 200.00, 'adresse 02'),
      ('seg 03', 'codex 03', 300.00, 'adresse 03'),
      ('seg 04', 'codex 04', 400.00, 'adresse 04'),
      ('seg 05', 'codex 05', 500.00, 'adresse 05')
    --------------
     
    --------------
    select * from `site`
    --------------
     
    +----+--------------+----------+---------+------------+
    | id | segmentation | codex    | montant | adresse    |
    +----+--------------+----------+---------+------------+
    |  1 | seg 01       | codex 01 |  100.00 | adresse 01 |
    |  2 | seg 02       | codex 02 |  200.00 | adresse 02 |
    |  3 | seg 03       | codex 03 |  300.00 | adresse 03 |
    |  4 | seg 04       | codex 04 |  400.00 | adresse 04 |
    |  5 | seg 05       | codex 05 |  500.00 | adresse 05 |
    +----+--------------+----------+---------+------------+
    --------------
    commit
    --------------
     
    --------------
    DROP TABLE IF EXISTS `installation`
    --------------
     
    --------------
    CREATE TABLE `installation`
    ( `id`    integer unsigned  not null auto_increment primary key,
      `clef`  integer unsigned  not null,
      `lib`   varchar(255)      not null,
      CONSTRAINT `FK_SITE` FOREIGN KEY (`clef`) REFERENCES `site` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `installation` (`clef`,`lib`) VALUES
      (1, 'clef 1 - 1'),
      (2, 'clef 2 - 1'),
      (1, 'clef 1 - 2'),
      (3, 'clef 3 - 1'),
      (2, 'clef 2 - 2'),
      (4, 'clef 4 - 1'),
      (3, 'clef 3 - 2'),
      (5, 'clef 5 - 1'),
      (5, 'clef 5 - 2'),
      (4, 'clef 4 - 2')
    --------------
     
    --------------
    select * from `installation`
    --------------
     
    +----+------+------------+
    | id | clef | lib        |
    +----+------+------------+
    |  1 |    1 | clef 1 - 1 |
    |  2 |    2 | clef 2 - 1 |
    |  3 |    1 | clef 1 - 2 |
    |  4 |    3 | clef 3 - 1 |
    |  5 |    2 | clef 2 - 2 |
    |  6 |    4 | clef 4 - 1 |
    |  7 |    3 | clef 3 - 2 |
    |  8 |    5 | clef 5 - 1 |
    |  9 |    5 | clef 5 - 2 |
    | 10 |    4 | clef 4 - 2 |
    +----+------+------------+
    --------------
    commit
    --------------
     
    --------------
    select      *
          from  `installation` as t1
     
    inner join  `site` as t2
            on  t2.id = t1.clef
     
      order by  t1.clef, t1.id
    --------------
     
    +----+------+------------+----+--------------+----------+---------+------------+
    | id | clef | lib        | id | segmentation | codex    | montant | adresse    |
    +----+------+------------+----+--------------+----------+---------+------------+
    |  1 |    1 | clef 1 - 1 |  1 | seg 01       | codex 01 |  100.00 | adresse 01 |
    |  3 |    1 | clef 1 - 2 |  1 | seg 01       | codex 01 |  100.00 | adresse 01 |
    |  2 |    2 | clef 2 - 1 |  2 | seg 02       | codex 02 |  200.00 | adresse 02 |
    |  5 |    2 | clef 2 - 2 |  2 | seg 02       | codex 02 |  200.00 | adresse 02 |
    |  4 |    3 | clef 3 - 1 |  3 | seg 03       | codex 03 |  300.00 | adresse 03 |
    |  7 |    3 | clef 3 - 2 |  3 | seg 03       | codex 03 |  300.00 | adresse 03 |
    |  6 |    4 | clef 4 - 1 |  4 | seg 04       | codex 04 |  400.00 | adresse 04 |
    | 10 |    4 | clef 4 - 2 |  4 | seg 04       | codex 04 |  400.00 | adresse 04 |
    |  8 |    5 | clef 5 - 1 |  5 | seg 05       | codex 05 |  500.00 | adresse 05 |
    |  9 |    5 | clef 5 - 2 |  5 | seg 05       | codex 05 |  500.00 | adresse 05 |
    +----+------+------------+----+--------------+----------+---------+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. [Débutant] Problème de variables
    Par bonnefr dans le forum SWT/JFace
    Réponses: 9
    Dernier message: 12/05/2004, 17h41
  2. Réponses: 2
    Dernier message: 28/04/2004, 11h25
  3. [Débutant] Problème de déconnexion d'une page JSP
    Par amal9 dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 22/01/2004, 13h40
  4. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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