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

MS SQL Server Discussion :

Probleme avec les contraintes primary key et foreign key


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Points : 32
    Points
    32
    Par défaut Probleme avec les contraintes primary key et foreign key
    Salut!

    je dois créer une base de donnée qui contient les tables suivantes:

    Opération(NumOperation,TypeOperation,MantantOperation,DateOperation,NumCompte#)

    Compte Bancaire(NumCompte,SoldeCompte,TypeCompte,NumClient#)

    Client(NumClient,NomClient,PrénomClient,AdresseClient,TélClient)

    avec les contraintes suivantes:
    • Les opérations sur un compte bancaire sont de 2 types : une opération de retrait ou une opération de dépôt (TypeOperation=˝D˝ si le client a déposé de l’argent sur son compte et TypeOperation=˝R˝ si le client a retiré de l’argent de son compte)
    • Un client ne peut avoir qu’un seul compte courant (TypeCompte=˝CC˝) et qu’un seul compte sur carnet (TypeCompte=˝CN˝)
    • Le numéro d’opération est automatique (auto- incrémenté)
    • La date de l’opération prend par défaut la date du jour.

    J'ai créer la base graphiquement,et voici le code de création des tables et les contraintes(je suis un débutants) :

    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
    --drop table Opération
    --drop table [Compte Bancaire]
    --drop table Client
     
     
    create table Opération (NumOperation int not null identity
                          ,TypeOperation char
                          ,MantantOperation money
                          ,DateOperation datetime default GetDate()
                          ,NumCompte int)
     
     
     
    create table [Compte Bancaire] (NumCompte int not null
                                   ,SoldeCompte money
                                   ,TypeCompte nvarchar(2) not null
                                   ,NumClient int)
     
    create table Client (NumClient int not null
                        ,CINClient nvarchar(10)
                        ,NomClient nvarchar(15)
                        ,PrénomClient nvarchar(15)
                        ,AdresseClient nvarchar(25)
                        ,TélClient nvarchar(15))
     
     
     
    alter table Opération 
    add constraint pk_NumOp primary key(NumOperation)
     
    alter table Client
    add constraint Pk_NumCl primary key (NumClient)
     
    alter table [Compte Bancaire]
    add constraint Pk_NumCo primary key(NumCompte,TypeCompte)
     
    alter table[Compte Bancaire]
    add constraint Uk_NumCl_TypeCo unique(NumClient,TypeCompte)
     
    alter table Opération 
    add constraint FK_NumCo foreign key(NumCompte) references [Compte Bancaire](NumCompte)
     
    alter table [Compte Bancaire]
    add constraint FK_NumCl foreign key(NumClient) references Client(NumClient)
     
     
     
    alter table Opération
    add constraint ChkTyOp check (TypeOperation='D' or TypeOperation='R' )
    Je reçois un message d'erreur :

    Msg 1776, Level 16, State 0, Line 40
    There are no primary or candidate keys in the referenced table 'Compte Bancaire' that match the referencing column list in the foreign key 'FK_NumCo'.
    Msg 1750, Level 16, State 0, Line 40
    Could not create constraint. See previous errors.
    Selon ce que j'ai compris je ne peux pas créer une clé etrangere sur la colone NumCompte de la table Operation en se referant avec la clé primaire FK_NumCo.

    Y a-t-il quelqu'un qui puisse me corriger les erreurs que j'ai ici svp, et merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Bonsoir haylox,

    La composition de la clé primaire de votre table CompteBancaire est surprenante, car elle signifie qu’un numéro de compte donné peut exister en N exemplaires, une fois par type de compte. Est-ce bien ce que vous comptez mettre en oeuvre ?

    Cela dit, quand une ligne est créée dans la table Opération, à quel compte l’opération concernée doit-elle faire référence ? Au compte courant ? A l’autre compte ? (Ça ne peut quand même pas être aux deux à la fois...) Le seul moyen de le faire savoir au SGBD est de lui fournir non pas un bout de clé (ce qu'il rejette à juste titre), mais une valeur complète de cette clé, c'est-à-dire une valeur de numéro de compte et une valeur de type de compte}.

    Maintenant, pourquoi n’avoir pas réduit la clé primaire de la table CompteBancaire à la seule colonne NumCompte ? Qu’est-ce que cela cache ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Points : 32
    Points
    32
    Par défaut
    Bon, je dois faire la combinaison de l'unicité entre quelles colonnes dans la table [Compte Bancaire]?

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Bonjour haylox,


    On part du principe que la définition correcte est celle que vous avez initialement donnée de la structure de la table Compte Bancaire :
    Compte Bancaire(NumCompte,SoldeCompte,TypeCompte,NumClient#)
    Structure du reste conforme à ce qui se pratique dans les entreprises.

    Traduction en SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE [Compte Bancaire] (NumCompte int NOT NULL
                                   ,SoldeCompte money
                                   ,TypeCompte nvarchar(2) NOT NULL
                                   ,NumClient int)
    ;
    ALTER TABLE [Compte Bancaire]
        ADD constraint Pk_NumCo PRIMARY KEY(NumCompte) ;
    D'où la structure de la contrainte référentielle entre les tables Compte Bancaire et Opération :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE Opération
        ADD constraint FK_NumCo FOREIGN KEY(NumCompte) REFERENCES [Compte Bancaire] (NumCompte) ;
    Qui au demeurant est celle que vous avez déjà établie.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Points : 32
    Points
    32
    Par défaut
    Merci , et je suis désolé j'ai cru que j'ai bien répondu et marqué cette discussion comme résolu ... bon merci encore , votre solution était ce que j'étais entrain de rechercher.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/07/2007, 14h53
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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