Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
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 22/06/2011, 15h33   #1
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Par défaut [MySQL][InnoDB] Contraintes sur deux champs entre deux tables

Bonjour,

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

Code :
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 :
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
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 20h03   #2
Membre actif
 
Homme Laurent
Inscription : juillet 2008
Messages : 141
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 30
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2008
Messages : 141
Points : 187
Points : 187
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)
ElbeDD est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h39.


 
 
 
 
Partenaires

Hébergement Web