Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 17h09   #1
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
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
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 17h15   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 084
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 084
Points : 1 881
Points : 1 881
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.
tatayo est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 18h12   #3
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Merci tatayo pour votre réponse rapide

Citation:
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


Citation:
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 :
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 :
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
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 18h44   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 004
Points : 18 272
Points : 18 272
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 19h01   #5
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Merci CinePhil

Citation:
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
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h47.


 
 
 
 
Partenaires

Hébergement Web