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 :

une astuce pour éviter le problème de la violation de la clé primaire


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 272
    Points : 59
    Points
    59
    Par défaut une astuce pour éviter le problème de la violation de la clé primaire
    Salut

    Dans le cadre de l'alimentation de mes tables de dimension et table de fait :

    je fais une modélisation multidimensionnelle avec le Schéma en Flocon, pour ma dimension Temps, Voici mes 3 tables pour cette dimension :

    TD_Temps(Date,mois,annee)

    TD_Mois(mois,annee)

    TD_Annee(annee)

    donc pour alimenter la table Temps puisque MOIS et ANNEE c'est des clés étrangères alors il faudra que je commence par l'alimentation de la Table TD_Annee puis TD_MOIS.

    bon j'ai fait mes requêtes et elles sont correctes j'ai pas de problème avec, Mon problème :

    - J'ai alimenté TD_annee sans aucun souci, Mais lors de l'alimentation de TD_Mois j'ai eu cette erreur de Sql : "Insertion Impossible, Violation de la clé primaire", bon c'est une erreur logique!

    Mais ce que je voudrais savoir, Est-ce qu'il y une astuce pour dépasser ce problème ?!

    Si vous avez quelque chose, n'hésitez pas a me proposé je suis prôneuse

    Merci d'avance

  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,
    Citation Envoyé par info3licen Voir le message
    TD_Mois(mois,annee)
    Si je comprends bien Mois est la clé primaire de cette table, et année est une clé étrangère ?
    Si Mois représente le numéro de mois dans l'année, tu as un problème: tu ne peux avoir qu'un seul "exemplaire" de chaque mois, toutes années confondues !
    La clé primaire doit être (mois,année), car un mois est unique dans une année seulement.

    Maintenant je spécule un peu, car tu ne nous montres pas tes requêtes...

    Tatayo.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 272
    Points : 59
    Points
    59
    Par défaut
    Merci tatayo pour votre réponse rapide

    Si je comprends bien Mois est la clé primaire de cette table, et année est une clé étrangère ?
    Oui c'est le cas


    La clé primaire doit être (mois,année)
    je pense que c'est la seule solution pour réglé ce probleme, Mais je me pose la question :

    Si une clé étrangère devient une clé primaire, Ça pose pas de probleme ?!

    Voici Mes requêtes :

    Pour alimenter la Table TD_Annee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Insert into DWHGaz.DBO.Annee 
    Select  aa from 
    ((Select Distinct year(Date_cou)as aa from Sonalgaz.DBO.Incident where year(Date_cou) not in (Select aa from DWHGaz.DBO.Annee))
    UNION
    (Select Distinct year(Annee) from Sonalgaz.DBO.FuiteGaz where year(Annee) not in (Select aa from DWHGaz.DBO.Annee))
    UNION
    (Select Distinct year(Date_acc) from Sonalgaz.DBO.Accident where year(Date_acc) not in (Select aa from DWHGaz.DBO.Annee))
    UNION
    (Select Distinct year(DateCou_tra)  from Sonalgaz.DBO.Travaux where year(DateCou_tra) not in (Select aa from DWHGaz.DBO.Annee))
    ) as T

    Pour alimenter dans TD_Mois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Insert into DWHGaz.DBO.Mois 
    Select  mm, aa from 
    ((Select Distinct Month(Date_cou)as mm,year(Date_cou)as aa from Sonalgaz.DBO.Incident)
    UNION
    (Select Distinct Month(Annee) as mm,year(Annee) from Sonalgaz.DBO.FuiteGaz)
    UNION
    (Select Distinct Month(Date_acc) as mm, year(Date_acc) from Sonalgaz.DBO.Accident)
    UNION
    (Select Distinct Month(DateCou_tra) as mm, year(DateCou_tra)  from Sonalgaz.DBO.Travaux)
    ) as T

    Merci

  4. #4
    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
    Citation Envoyé par info3licen Voir le message
    Si une clé étrangère devient une clé primaire, Ça pose pas de probleme ?!
    Non.
    Dans la modélisation de l'héritage, la clé primaire de la table fille est aussi clé étrangère faisant référence à la clé primaire de la table mère.

    Dans une table associative, la clé primaire est composée des clés étrangères faisant référence aux clés primaires des tables impliquées dans l'association.

    Plus généralement, à chaque fois qu'il y a identification relative, la clé étrangère participe à la clé primaire. Et c'est bien le cas pour le calendrier mais est-ce bien utile de modéliser le calendrier comme ça ?

    Soit une table des dates est suffisante pour ton besoin et tu retrouves l'année et le mois de chaque date avec les fonctions de date en SQL, soit tu modélises un calendrier complet, à la manière de SQLPro.
    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 !

  5. #5
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 272
    Points : 59
    Points
    59
    Par défaut
    Merci CinePhil

    Plus généralement, à chaque fois qu'il y a identification relative, la clé étrangère participe à la clé primaire. Et c'est bien le cas pour le calendrier mais est-ce bien utile de modéliser le calendrier comme ça ?

    Soit une table des dates est suffisante pour ton besoin et tu retrouves l'année et le mois de chaque date avec les fonctions de date en SQL
    Oui c'est vrai j'avais une possibilité de faire une seule table, Mais puisque je fait une modélisation multidimensionnelle avec le schéma en Flocon alors il faut que je montre cette hiérarchie (Date ->Mois -> Annee) dans ce modèle

    Voila donc (Mois, Annee) est devenu une seule clé et maintenant mon insertion marche bien sans aucun probleme

    Merci pour votre aide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/04/2010, 15h21
  2. Une astuce pour un window.close ?
    Par renaud26 dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 10/07/2009, 09h11
  3. Une procédure pour éviter la violation de clé
    Par souminet dans le forum Débuter
    Réponses: 2
    Dernier message: 25/10/2008, 15h55
  4. Réponses: 3
    Dernier message: 10/04/2008, 15h56
  5. une astuce pour ouvrir la base de registre d'un autre disque
    Par bouassouille dans le forum Windows XP
    Réponses: 4
    Dernier message: 07/10/2005, 00h53

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