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 :

Débutant SQL problème Foreign Key


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 55
    Points : 39
    Points
    39
    Par défaut Débutant SQL problème Foreign Key
    Bonjour le forum,
    Dans le cadre de mes études, j'ai un projet en SQL à créer from scratch.
    Mes créations des 2 tables initiales n'ont pas de problème, mais pour éviter une relation n à n, je créé une table pivot en parallèle qui se met en erreur.
    Le code de cette table est le suivant :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Create table personne_ci(
    	personne_id INTEGER not NULL,
    	ci_id INTEGER not NULL,
    	FOREIGN key (personne_id) REFERENCES personne_bdd (personne_id) on delete cascade on update cascade,
    	FOREIGN key (ci_id) REFERENCES ci_bdd (ci_id) on delete cascade on update cascade,
    	PRIMARY(personne_ci.personne_id,personne_ci,ci_id)
    );

    toutes les refs sont bonnes et les primary Key bien identifiées... une idée ?
    Précision : c'est sur SQLite.

    En vous remerciant,

    ArthurSL

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Ce serait bien de nous donner le message d'erreur...
    Quoi qu'il en soit je vois une erreur dans la déclaration de la clé primaire: tu as mis une virgule au lieu d'un point pour la deuxième colonne (personne_ci,ci_id => personne_ci.ci_id)

    Tatayo.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 55
    Points : 39
    Points
    39
    Par défaut nouveau problème
    Bonjour,

    Merci pour ta réponse, la solution en fait était toute bête, il manquait simplement "KEY" à ma primary...

    Cependant, je suis maintenant confronté aux requêtes que je souhaitais faire :

    Je met le code de create table avant d'expliquer mes requetes :
    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
    --bdd personnnes
    CREATE TABLE personne_bdd(
    		personne_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,			 												
    		sexe TEXT NOT NULL,									 															
    		nom text not NULL,
    		prenom text not NULL,		
    		region_name text not NULL,			
    		departement_name text not null,		
    		ville_name text not null
    );
     
    --insertion data personnes 
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (01,'Homme','Dupont','Charles','Auvergne-Rhône-Alpes','Cantal','Aurillac');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (02,'Femme','Cuevas','Marie','Auvergne-Rhône-Alpes','Puy-de-Dôme','Clermont-Ferrand');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (03,'Homme','Orr','Gabriel','Auvergne-Rhône-Alpes','Loire','Saint-Etienne');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (04,'Femme','Mercer','Laura','Auvergne-Rhône-Alpes','Ain','Bourg-en-Bresse');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (05,'Homme','Huerta','Valentin','Bourgogne-Franche-Comté','Saône-et-Loire','Mâcon');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (06,'Femme','Lin','Denise','Bourgogne-Franche-Comté','Yonne','Auxerre');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (07,'Homme','Soto','Louis','Bourgogne-Franche-Comté','Jura','Lons');
    Insert into personne_bdd(personne_id,sexe,nom,prenom,region_name,departement_name,ville_name) VALUES (08,'Femme','Reese','Bernadette','Bourgogne-Franche-Comté','Doubs','Besançon');
     
    --creation bdd Centre intéret
    CREATE TABLE ci_bdd(
    	ci_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    	sport TEXT, 												
    	art TEXT,
    	regime_alimentaire text,
    	animaux text
    );
     
    --insertion données
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (101,'sport de raquettes','opera','tout','chien');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (123,'sport de raquettes','opera','vegetarien','chat');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (234,'sport collectif','danse classique','vegan','chat');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (345,'sport collectif','peinture','flexitarien','hamster');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (456,'sport de combat','cinema','vegetarien','chat');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (567,'golf','opera','vegetalien','chien');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (678,'sport equin','cinema','vegan','cheval');
    Insert into ci_bdd(ci_id,sport,art,regime_alimentaire,animaux) VALUES (789,'golf','theatre','tout','hastmer');
     
    --creation table pivot
    Create table personne_ci(
    	personne_id INTEGER not NULL,
    	ci_id INTEGER not NULL,
    	FOREIGN key (personne_id) REFERENCES personne_bdd (personne_id) on delete cascade on update cascade,
    	FOREIGN key (ci_id) REFERENCES ci_bdd (ci_id) on delete cascade on update cascade,
    	PRIMARY KEY(personne_id,ci_id)
    );
     
    --insertion data
    INSERT INTO personne_ci (personne_id,ci_id) values (01,101);
    INSERT INTO personne_ci (personne_id,ci_id) values (02,123);
    INSERT INTO personne_ci (personne_id,ci_id) values (03,234);
    INSERT INTO personne_ci (personne_id,ci_id) values (04,345);
    INSERT INTO personne_ci (personne_id,ci_id) values (05,456);
    INSERT INTO personne_ci (personne_id,ci_id) values (06,567);
    INSERT INTO personne_ci (personne_id,ci_id) values (07,678);
    INSERT INTO personne_ci (personne_id,ci_id) values (08,789);
    Ici, l'idée est d'associer une personne à un centre d'intérêt et de voir le nombre de points commun entre les 2 .
    Autrement, je voulais sans forcement associer à une personne, voir quelle ligne avait le plus de points commun dans les centre d'intérêts.

    En vous remerciant,

    ArthurSL

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour Arthursl et bienvenue sur le forum.

    Quand une colonne est de type auto_increment, il est recommandé de ne pas la mentionner dans l'ordre insert, car c'est le moteur du SGBD qui va en fournir la valeur et ainsi en garantir l'unicité.
    En citant la colonne, on s'expose au risque de clef en double et donc de rejet .

    Concernant votre modèle de données, il n'est pas bon de mettre dans une même table les éléments relatifs à la personne, à l'adresse, la ville et la région
    Comme vous l'avez probablement appris, tous les attributs d'une type d'entité doivent dépendre fonctionnellement de leur identifiant.
    Or la ville ou la région ne dépendent évidemment pas de l'identifiant de la personne, mais respectivement de l'identifiant de la ville et de celui de la région.

    Il convient de modéliser, conceptuellement (ici je simplifie en ne prenant pas en compte un historique éventuel des adresses) :
    [PERSONNE] 1,1 ---(resider) ---1,1(R) [ADRESSE] 1,1 --- (situer) --- 0,n [VILLE] 1,1 --- (localiser) --- 0,n [REGION]

    Ce qui donne les tables suivantes (PK soulignées, FK suffixées par #)
    [PE_PERSONNE] (PE_ident, PE_,nom, PE_prenom, PE_date_naissance...)
    [RG_REGION](RG_ident, RG_nom...)
    [VI_VILLE](VI_ident, VI_code_insee, VI_libelle, RG_ident#)
    [AD_ADRESSE] (PE_ident #, AD_seq, AD_ligne1, AD_ligne2..., VI_ident#)

    Ici j'ai identifié l'adresse relativement à la personne (présence du (R) près des cardinalités), d'où la présence le la FK PE_ident comme composante de la PK de l'adresse, PK adresse complétée par un numéro de séquence AD_seq pour en garantir l'unicité.

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

Discussions similaires

  1. Problème foreign key avec hibernate
    Par souhait dans le forum Hibernate
    Réponses: 5
    Dernier message: 05/09/2008, 15h23
  2. Problème Foreign Key : "ErrCode:150"
    Par seangg dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 19/08/2008, 15h53
  3. Problème foreign Key
    Par Itori dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/05/2008, 09h06
  4. Réponses: 2
    Dernier message: 09/08/2007, 12h38
  5. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55

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