Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 18/03/2011, 11h14   #1
Invité régulier
 
Inscription : décembre 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 18
Points : 6
Points : 6
Par défaut Requête insert into et les clés étrangères

Bonjour,

ça fait quelques jours que je débute avec MS sql-server2008. et je commence à avoir des problemes. En effet, j'essaye d'implementer un exemple simple dont voici le MCD:

[ville]---0,1---(est capitale de)----1,1----[pays]
[ville]---1,1---(fait partie de)------1,n----[pays]
-un pays a une seule capitale et une ville est soit une capitale soit non.
-un pays a plusieurs villes, une ville appartient a un seul pays.
avec:
ville(IDv,nomVille)
pays(IDp,nomPays)
en passant au relationel on aura:
ville(IDv,nomVille,#IDp)
pays(IDp,nomPays,#IDv)

j'ai créé la petite bdd sous sql, j'ai mis les relations entre les tables. Mais quand j'essaye de "remplir" les tables avec la requette suivante:

Code :
1
2
INSERT INTO ville
VALUES (13,'merseillle',15)
il m'affiche le message d'erreur suivant:
Citation:
"Msg 547, Niveau 16, État 0, Ligne 1
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ville_pays". The conflict occurred in database "poire", table "dbo.pays", column 'idP'."
tix116 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 11h52   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Je pense comprendre ton problème (référence circulaire), mais ton exemple m'interpelle :

Tu veux inserer la ville de Marseille (merseille ?) dans la table Ville, rattachée au pays ayant l'ID 15. Je suppose donc que ta table Pays est déjà peuplée avec la France, ID=15 ? (en fait, c'est pour insérer la France, que tu aurais dû avoir un problème, tant que Paris n'existe pas dans la table des villes, et pour insérer Paris dans la table des Villes, tant que La France n'existe pas dans la table des pays...)

Donc :
As-tu dans ta table "Pays" une ligne avec un ID=15 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 12h19   #3
Invité régulier
 
Inscription : décembre 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 18
Points : 6
Points : 6
Marseille oui désolé
Vous avez compris mon problème! mais maintenant la bdd est vide ...! même si je commence par insérer France dans pays, j'ai le même problème vu que (comme vs avez mentionné) paris n'existe pas dans ville .....
tix116 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 12h41   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Je voit pas le problème, sauf que vous devez "ouvrir" la cardinalité :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE pays
(IDp       INT PRIMARY KEY,
nomPays    VARCHAR(64) NOT NULL,
IDv        INT)
GO
 
CREATE TABLE ville
(IDv       INT PRIMARY KEY,
 nomVille  VARCHAR(32) NOT NULL,
 IDp       INT NOT NULL 
           FOREIGN KEY REFERENCES pays(IDp));
 GO
Code :
1
2
3
INSERT INTO pays VALUES (1, 'France', NULL);
INSERT INTO ville VALUES (111, 'Paris', 1);
UPDATE pays SET IDv = 111 WHERE IDp = 1;
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 12h56   #5
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Salut
A partir du moment où une ville n'appartient qu'à un pays, pourquoi ne pas changer la structure des tables ville en ajoutant une colonne "estcapitale bit default(0)" à ville et enlevant la relation le fk de pays sur ville?
On me dira pourquoi ne pas mettre le tout dans une seule table?
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 14h15   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
On me dira pourquoi ne pas mettre le tout dans une seule table?
Mais encore?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 14h19   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
en ajoutant une colonne "estcapitale bit default(0)"
Notez que pour garantir l'intégrité de votre base vous devez aussi penser à ajouter une contrainte afin de s'assurer qu'un pays n'ai qu'une capitale (non économique j'entends).
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 16h14   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
En effet l'Afrique du Sud a trois capitales :

- Pretoria : administrative
- Le Cap : législative
- Bloemfontein : judiciaire

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 16h29   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Oui c'est un cas extrême mais d'autres pays ont deux capitales:
http://fr.wikipedia.org/wiki/Liste_d...tales_du_monde
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 16h34   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Et l'état de Nauru n'en a pas !

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 09h24   #11
Invité régulier
 
Inscription : décembre 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 18
Points : 6
Points : 6
Citation:
Envoyé par alassanediakite Voir le message
Salut
A partir du moment où une ville n'appartient qu'à un pays, pourquoi ne pas changer la structure des tables ville en ajoutant une colonne "estcapitale bit default(0)" à ville et enlevant la relation le fk de pays sur ville?
On me dira pourquoi ne pas mettre le tout dans une seule table?
merci, je pense que je vais opter pr cette solution.

merci aux autres réponses ^^
tix116 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 01h04   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
avec une telle solution, tu risque d'avoir :
des pays sans capitale
des pays avec plusieurs capitales


a moins de mettre des contraintes check/triggers, qui seront beaucoup moins performantes que des contraintes d'integrité referentielles. La solution que t'a proposée SQLPro est la plus proche de ton modèle actuel, et à mon avis meilleur.

Tu pourrais même peupler complètement ta table pays avec tous les pays, peupler ta table ville avec toutes les capitales, et ensuite remettre cette contrainte d’intégrité !

Je pense que ça serait plus performant comme ça !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 09h38   #13
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
et ensuite remettre cette contrainte d’intégrité
Tu veux dire désactiver temporairement la FK lors de l'insertion?

Mauvaise idée selon moi: durant ce temps, ta base risque de perdre son intégrité...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 22h02   #14
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
non, je veux dire ne pas la mettre !

les pays ne changent pas tous les quatre matins, et je pense qu'il peut être utile de peupler complètement la table pays, ainsi que la table ville pour les capitales. ensuite placer les FK.

Mais bon, dans la mesure ou à mon sens il n'y a pas de solution 100% propre pour ce genre de cas, il faut voir en fonction du besoin (par exemple, si l'IHM ne permet pas l'ajout de pays, le problème ne se pose pas )
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 08h29   #15
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Ok dans le cas ou les deux tables seront alimentés en One Shotà l'init de l'appli par exemple.
Daccord avec toi...

Mais.... parfois les pays sont renomés où changent de capitale... comme en birmanie par exemple ( ok c'est rare ).
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 09h50   #16
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Ces contraintes ne posent aucun problème pour renommer un pays, ou pour changer sa capitale. C'est juste pour la création d'un pays que cela pose problème... ce qui arrive encore moins souvent

donc comme je disais, cela dépend du besoin, mais si comme je le pense la table pays est gérée "à la main", je pense que le modèle initial de tix116 est le bon, et qu'il suffit alors de placer la contrainte FK sur la capitale une fois les tables peuplées.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 10h50   #17
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
salut
Q:Avec le premier modèle, qu'est ce qui empêche d'avoir un pays sans capitale?
R:2 insertions + 1 update
Or avec le deuxième modèle, 2 insertions suffisent.
Questions:
Quelle est la capitale de l'Afrique du Sud?
Que pense le maître sqlpro des deux modèles?
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 10h56   #18
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Le premier modèle? le votre?
Vous aviez votre FK en NOT NULL... donc impossible d'avoir un pays sans capitale.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk 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 22h23.


 
 
 
 
Partenaires

Hébergement Web