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 :

Interrogations sur le fonctionnement du SQL


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Interrogations sur le fonctionnement du SQL
    Bonjour,
    Je suis nouveau dans le monde des bases de données et j'aurai besoin de vos lumières pour m'aider à résoudre certaines interrogations concernant le fonctionnement du SQL.

    Voici la base de donnée:
    RACE (idRace,appellation)
    IdRace :Clé primaire

    ELEVEUR (idEleveur, nomEleveur, adresseRueEleveur, adresseCPEleveur, adresseVilleEleveur)
    idEleveur :Clé primaire

    VACHE(idVache,dateArrivee,idRace,idEleveur)
    idVache :Clé primaire
    idRace :Clé étrangère en référence à idEleveur de ELEVEUR
    idEleveur: Clé étrangère en référence à idRace de RACE

    INTERVENTION(idInter,libelleInter)
    idInter :Clé primaire

    PRATIQUER (dateInter,idInter,idVache)
    DateInter,idInter,idVache :Clé primaire
    idInter :Clé étrangère en référence à idInter de INTERVENTION
    idVache :Clé étrangère en référence à idVache de VACHE

    A partir de ce schéma relationnel on me demande de mettre à jour la base en intégrant le fait que les vaches arrivées le 20/08/2010 ont été euthanasiées le jour même.
    Pour ce faire voici mes requêtes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO pratiquer (idInter, dateInter, idVache)
    SELECT NULL, dateArrivee, idVache
    FROM vache
    WHERE dateArrivee = '20/08/2010'
    
    INSERT INTO intervention (libelleInter, idInter)
    SELECT 'euthanasie', idInter
    FROM pratiquer
    WHERE dateInter = '20/08/2010'
    Le problème se pose au niveau du champs idInter qui est une clé primaire donc NON NULL. Si je laisse ce champ vide le SGBDR me renverra une erreur de même si je mets NULL. Sachant que je ne peux connaitre la valeur de ce champ comment puis-je faire pour que celui-ci s'incrémente automatiquement? Ne connaissant ni sa valeur, ni le type de donné je suis perdu.

    Seconde interrogation:
    On me demande de modifier à partir du schéma relationnel ci-dessous la base de données pour mémoriser la généalogie d'une vache, c'est à dire lors d'une mise bas, enregistrer l'identité de la "vache-mère" d'une vache.

    VACHE(idVache, dateArrivee, idRace, idEleveur, idPays)
    idVache :Clé primaire
    idRace :Clé étrangère en référence à idEleveur de ELEVEUR
    idEleveur: Clé étrangère en référence à idRace de RACE
    idPays: Clé étrangère en référence à idPays de PAYS
    idMere: Clé étrangère en référence à idvache de VACHE

    Dictionnaire des données:
    idVache character varying précision 0

    Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE vache
    ADD CONSTRAINT fk_mere FOREIGN KEY (idMere) REFERENCES vache (idVache)
    Le problème est que si je ne me trompe une clé étrangère tout comme une clé primaire doit toujours être au préalable déclarée or dans le schéma relationnel idMere ne l'est pas. Est-ce que ma requête fonctionnera?

    En vous remerciant par avance pour les éclaircissement que vous pourrez m'apporter.
    Cordialement

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    1/ Tu peux récupérer ta clé primaire max de ta table et tu rajoute +1 pour chaque nouvelle vache.

    Pour cela le mieux est de faire une procédure.

    2/ Pour la deuxième question, ce tutoriel t'aideras certainement (MATCH PARTIAL)
    ~ Lola ~

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par lola06 Voir le message
    1/ Tu peux récupérer ta clé primaire max de ta table et tu rajoute +1 pour chaque nouvelle vache.

    Pour cela le mieux est de faire une procédure.
    Il vaut mieux laisser le SGBD gérer tout seul ce genre de choses (Sequence sous Oracle ou Identity sous SQL Server, par exemple), sinon vous risquez fort de vous retrouver avec des conflits mal gérés.

  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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    A partir de ce schéma relationnel on me demande de mettre à jour la base en intégrant le fait que les vaches arrivées le 20/08/2010 ont été euthanasiées le jour même.
    Pour ce faire voici mes requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO pratiquer (idInter, dateInter, idVache)
    SELECT NULL, dateArrivee, idVache
    FROM vache
    WHERE dateArrivee = '20/08/2010'
     
    INSERT INTO intervention (libelleInter, idInter)
    SELECT 'euthanasie', idInter
    FROM pratiquer
    WHERE dateInter = '20/08/2010'
    D'après le schéma de tes tables, pratiquer.idInter est une clé étrangère référençant une intervention de la table intervention.

    Il faut donc d'abord insérer dans la table intervention puis dans la table pratiquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO intervention (libelleInter)
    VALUES('euthanasie');
     
    INSERT INTO pratiquer (idInter, dateInter, idVache)
    VALUES (
    	(SELECT idInter
    	FROM intervention
    	WHERE libelleInter = 'euthanasie'),
    	'20/08/2010',
    	:idVache -- paramètre venant du programme d'insertion
    );
    Mais il serait souhaitable de vérifier d'abord si l'intervention n'existe pas déjà. D'ailleurs, généralement, l'interface utilisateur propose une liste des interventions déjà référencées en BDD et l'utilisateur choisit l'intervention à affecter à la vache.
    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 émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Il vaut mieux laisser le SGBD gérer tout seul ce genre de choses (Sequence sous Oracle ou Identity sous SQL Server, par exemple), sinon vous risquez fort de vous retrouver avec des conflits mal gérés.
    Je suis bien d'accord mais perso je suis en train de travailler avec une base de données dont tous les identifiants sont en number . Si c'est son cas alors en général c'est cette solution qui est utilisée.
    ~ Lola ~

  6. #6
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Je suis bien d'accord mais perso je suis en train de travailler avec une base de données dont tous les identifiants sont en number .
    NUMBER, c'est le type (SGBD Oracle ?)
    Et on associe une séquence à l'identifiant qui incrémente automatiquement cet id de type NUMBER à chaque insertion de ligne.
    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 !

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Je vous remercie pour toutes vos réponses mais après de nombreuses recherche je ne sais toujours pas comment remplir le champ idInter sachant que pratiquer.idInter est à la fois une clé primaire de la table pratiquer mais aussi une clé étrangère en référence à idInter de Intervention. Je cherche une fonction ou une astuce pour que ce champ s'incrémente automatiquement. J'ai bien pensé à (idInter +1) mais ne connaissant pas sa valeur ni le type de données qu'il contient ceci est risqué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO intervention (libelleInter)
    VALUES('euthanasie');
     
    INSERT INTO pratiquer (idInter, dateInter, idVache)
    VALUES (
    	(SELECT idInter
    	FROM intervention
    	WHERE libelleInter = 'euthanasie'),
    	'20/08/2010',
    	:idVache -- paramètre venant du programme d'insertion
    );
    L'intervention n'existe pas encore puisqu'il faut mettre à jour la base de données pour prendre en compte l’euthanasie des vaches qui sont arrivées le 20/08/2010.

    Peut-être que je me trompe Cinephil (tu t'y connais surement bien mieux que moi) mais idInter étant une clé primaire et donc forcement NON NULL si j'ajoute une nouvelle intervention (ici euthanasie) sans remplir le champ idInter le SGBDR ne va t-il pas me renvoyé une erreur pour violation ?

    Rei Ichido ne connaitrais-tu pas l'équivalent de Sequence sous Oracle ou Identity sous SQL Server sous PostGreSQL ? (eh oui celui-ci est l'heureux élu non pas de mon coeur mais de celui de mon prof).

    Merci Lola d'avoir essayer de répondre à ma seconde question mais la fonction MATCH PARTIAL ne me sera pas d'un grand secours dans ce cas la sachant qu'a partir du schéma relationnel modifié on me demande de modifier la base de données pour mémoriser la généalogie d'une vache, c'est à dire lors d'une mise bas, enregistrer l'identité de la "vache-mère" d'une vache. Le problème c'est que la clé étrangère idMere en référence à idvache de VACHE n'est pas déclarée dans le schéma relationnel modifié. Or d'après mes cours une clé primaire ou étrangère doit toujours être déclarée.
    Si je mets à jour cette base à partir de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE vache
    ADD CONSTRAINT fk_mere FOREIGN KEY (idMere) REFERENCES vache (idVache)
    Cela fonctionnera t-il même si idMere n'est pas au préalable déclarée dans la table VACHE ?

    Encore merci d'avance pour toutes vos idées de solutions.
    Cordialement

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Il y a un article ici-même

Discussions similaires

  1. Interrogations sur méthodes de récupération SQL
    Par jeremy L dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2015, 10h32
  2. Interrogations sur le fonctionnement de Vshpere
    Par Euphorisant dans le forum VMware
    Réponses: 1
    Dernier message: 10/09/2012, 17h22
  3. Petite interrogation sur le fonctionnement du goto
    Par crodilus dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 26/12/2011, 22h49
  4. Interrogation sur le fonctionnement des sessions
    Par mdordenart dans le forum Windows Communication Foundation
    Réponses: 2
    Dernier message: 10/03/2009, 09h02
  5. Interrogations sur SQL Server XE
    Par cnguyen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/08/2006, 15h57

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