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

Requêtes MySQL Discussion :

[MySQL][InnoDB] Contraintes sur deux champs entre deux tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Par défaut [MySQL][InnoDB] Contraintes sur deux champs entre deux tables
    Bonjour,

    J'ai une table "produit" définie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pid UNSIGNED SMALL INT, NOT NULL 
    nom VARCHAR(125)
    J'ai défini une clé primaire sur le couple (pid, nom).

    J'ai une autre table utilisateur_log_play définie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uid UNSIGNED MEDIUM INT, NOT NULL 
    pid UNSIGNED SMALL INT
    pnom VARCHAR(125)
    uid possède un index et une contrainte sur une table utilisateur (non décrite ici), jusque là pas de soucis.

    Je voudrais par contre lier les champs pid et pnom de la table utilisateur_log_play à ceux de la table produit, j'aimerais mettre comme contrainte sur le champ pid (ON DELETE SET NULL et ON UPDATE CASCADE) et sur le champ pnom (ON DELETE NO ACTION et ON UPDATE CASCADE)

    En gros, si on modifie l'id ou le nom d'un produit, la table utilisateur_log_play est mis à jour, si on supprime un produit seul la reference pid est mis à zero, on ne change pas pnom.

    Est-ce possible ? Comment ?

    Merci beaucoup.
    Cordialement

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Par défaut
    Bonjour,
    La syntaxe SQL est définie ainsi:
    http://dev.mysql.com/doc/refman/5.1/...nstraints.html.

    Tu pourrais donc faire sans soucis ta contrainte avec ON UPDATE CASCADE, mais ce n'est pas possible d'avoir un comportement différent sur 2 champs de la FK.

    Le problème est le suivant : Si le champ utilisateur_log_play.pid devient NULL, mais pas le champ pnom, tu ne respectes pas la contrainte d'integrité.

    Mais est-ce réellement la bonne solution ? Je ne vois pas trop l'intérêt du comportement désiré. En plus, je ne comprends pas (mais je n'ai pas le contexte) pourquoi avoir une PK (pid,nom). À la lecture, ton pid me semble ta PK (Produit IDentifiant), et nom un attribut "unique" (Une 2eme PK).


    Néanmoins, tu peux peut-être faire le comportement souhaité avec des triggers:
    A L'INSERT dans utilisateur_log_play , Trigger vérifiant qu'il y'a des enregistrements correspondants dans produit.
    A L'UPDATE dans produit, Trigger déclanchant UPDATE dans les champs utilisateur_log_play

    AU DELETE dans produit, Trigger déclanchant UPDATE dans le champ utilisateur_log_play.pid (=NULL)

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/06/2015, 08h21
  2. Différence entre deux champs de deux tables
    Par minooo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/12/2010, 13h54
  3. calcul entre deux champs dans une table
    Par pomar dans le forum Access
    Réponses: 7
    Dernier message: 29/11/2006, 18h27
  4. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 20h53
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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