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

SQL Procédural MySQL Discussion :

Contrainte inclusion étendue


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Contrainte inclusion étendue
    Bonjour,
    Pour traduire la contrainte inclusion qui est sur le schéma ci-dessous je sais que je dois utiliser un trigger


    Pour chaque insertion dans la table subir, il faut que je vérifie que l'étudiant est inscrit dans l'uv concerné par le contrôle
    Mais je ne voie pas comment faire.
    Merci de votre aide
    Yann

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    va tout les objets triviaux.
    une table étudiant ( id, nometudiant )
    une table uv ( id, nomuv )
    une table controle ( id, nomcontrole )

    va pour les associations

    une table pour l'association inscrit( id, idetudiant, iduv)
    une table ..... portersur( id, idcontrole, idiv)
    une table ..... subir( id, idinscrit, idportersur )

    enfin de fait ça en 10 secondes sans réfléchir, doit certainement un moyen de ne faire que deux tables.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    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
    OK pour ça (et encore partiellement, voir plus bas) :
    va tout les objets triviaux.
    une table étudiant ( id, nometudiant )
    une table uv ( id, nomuv )
    une table controle ( id, nomcontrole )
    Pas sur ça :
    va pour les associations
    une table pour l'association inscrit( id, idetudiant, iduv)
    une table ..... portersur( id, idcontrole, idiv)
    une table ..... subir( id, idinscrit, idportersur )
    Une table associative a pour clé primaire les identifiants des tables entrant en jeu dans l'association.

    Avec une association (1,1 - 0,n) l'identifiant de la table du côté 0,n donne une clé étrangère dans la table côté 1,1.

    Donc avec le MCD donné, on a plutôt les tables suivantes :
    Uv (uv_id, uv_nom...)
    Etudiant (etu_id, etu_nom, etu_prenom...)
    Controle (ctr_id, ctr_id_uv...)
    Subir (sbr_id_etudiant, sbr_id_controle, sbr_date, sbr_note...)
    Inscrire (ins_id_etudiant, ins_id_uv, ins_annee...)

    Et il faut effectivement vérifier par un TRIGGER ON INSERT sur la table Subir que le couple {sbr_id_etudiant, ctr_id_uv (obtenu en utilisant sbr_id_controle} existe bien parmi les couples {ins_id_etudiant, ins_id_uv} de la table Inscrire.

    N'en ayant encore fait que très peu, le mien sera peut-être faux mais dans le principe ça devrait être quelque chose comme ça :
    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
    CREATE TRIGGER tg_insert_subir BEFORE INSERT ON Subir FOR EACH ROW
    DELIMITER //
    BEGIN
        IF
        (
            SELECT COUNT(*)
            FROM Inscrire AS i
            INNER JOIN Uv ON Uv.uv_id = i.ins_id_uv
                INNER JOIN Controle AS c ON c.ctr_id_uv = uv.uv_id
            WHERE c.ctr_id = NEW.sbr_id_controle
                AND i.ins_id_etudiant = NEW.sbr_id_etudiant
        )
        = 0
        THEN
            CALL pa_generer_erreur('L''étudiant n''est pas inscrit à l''uv de ce contrôle !');
        END IF
    END//
    Et la procédure pa_generer_erreur ci-dessous permet de générer une erreur que le programme utilisant la BDD peut récupérer et traiter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELIMITER //
     
    CREATE PROCEDURE pa_generer_erreur(_Message VARCHAR(128))
    BEGIN
      INSERT INTO ta_erreur_err (err_message) VALUES (_Message);
      INSERT INTO ta_erreur_err (err_message) VALUES (_Message);
    END//
    Elle insère deux fois la même ligne alors qu'il y a une contrainte d'unicité sur le texte du message.

    Quand à la table ta_erreur_err, la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `ta_erreur_err` (
      `err_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `err_message` varchar(128) NOT NULL COMMENT 'Libellé du message d''erreur',
      `err_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de génération du message d''erreur.',
      PRIMARY KEY (`err_id`),
      UNIQUE KEY `x_u_err_message` (`err_message`)
    ) ENGINE=MEMORY DEFAULT CHARSET=latin1
    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 !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponses
    Yann

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

Discussions similaires

  1. Contraintes d'exclusion / totalité / inclusion
    Par Sandriiine dans le forum PowerAMC
    Réponses: 2
    Dernier message: 24/07/2009, 13h10
  2. contraintes inclusion exclusion totalité
    Par ds_ryo dans le forum PowerAMC
    Réponses: 7
    Dernier message: 10/04/2009, 22h39
  3. Réponses: 2
    Dernier message: 27/02/2007, 13h50
  4. [MCD]Contrainte d'inclusion
    Par >__|< dans le forum Schéma
    Réponses: 4
    Dernier message: 19/01/2007, 22h26
  5. Comment modeliser contrainte inclusion?
    Par djsbens dans le forum Schéma
    Réponses: 4
    Dernier message: 13/02/2006, 07h21

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