JeuWeb - Crée ton jeu par navigateur
[SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère (/showthread.php?tid=5548)



[SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - niahoo - 11-07-2011

Bonsoir,

Je suis en train de modéliser des tables et j'aurais besoin d'un petit cou de pouce :

CREATE TABLE t0 (
id SERIAL PRIMARY KEY,
is_qqch bool DEFAULT false
);

CREATE TABLE t1 (
id SERIAL PRIMARY KEY,
t0_id iteger REFERENCES t0
);

CREATE TABLE t2 (
id SERIAL PRIMARY KEY,
t1_id integer REFERENCES t1,
CHECK( t1.t0_id --> t0.is_qqch == true) -- ICI !
);

Pour insérer une ligne dans t2, il faut que l'integer proposé pour y corresponde à une ligne de t1 dont le t0_id correspond lui-même à une ligne de t0 ayant pour valeur 'true' au champ is_qqch.

Est-ce possible ?

Merci !


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - srm - 11-07-2011

Avec un trigger oui, je ne sais pas si MySQL le permet suffisamment bien, PostgreSQL oui :')


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - Bertrand - 11-07-2011

Je pense que CHECK ne permet que de faire des contrôles sur les colonnes (éventuellement plusieurs) de la table elle-même.
Et attention avec les contraintes check, si tu utilises mysql, elles sont purement ignorées (cf doc en anglais, la traduction française laisse penser qu'innodb les gère).
Les triggers doivent permettre de faire ce que tu veux, dans une certaine mesure. Il y a un article sur developpez.com. Par contre, je resterais prudent, le trigger va être déclenché quand tu manipuleras t2, pas les autres tables. Donc il serait possible de modifier un enregistrement de t0 (ou de t1) et de rendre invalide des enregistrements de t2; sauf à mettre des triggers sur chaque table.


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - niahoo - 12-07-2011

Ok donc j'ai regardé hier soir (il me semblait avoir répondu mais bon …) comment créer les triggers.

Effectivement le trigger va être déclenché lors de l'insertion mais les données pourront être corrompues « par derrière ». Ça ne me gêne pas outre mesure parce-qu'il n'y a que moi qui toucherais à ces tables : ce sont des données statiques. (par exemple des armes, objets, resources …) qui ne bougeront plus et à la limite la présence d'une ligne insérée par erreur ne gênera pas, elle ne devrait pas être appelée.

Mais je risque de me faire une petite interface en PHP pour créer ces données et comme on a tendance à bidouiller ça rapidement (autant le code de l'interface que les boutons de l'interface) ça peut aider.

Et pis surtout ça permet de découvrir un truc pour le jour ou j'en aurai besoin vraiment.

Bon bah je viendrai poster mon code si j'y arrive.


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - srm - 13-07-2011

Par derrière ?
Tu peux mettre un trigger sur l'update aussi.


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - niahoo - 13-07-2011

ouais par derrière, en modifiant les tables parentes sans supprimer la ligne dans ma table qui déclenche le trigger sur l'INSERT.

Et donc effectivement je peux pallier ça en foutant des triggers partout (si tant est que j'arrive à les faire fonctionner) et c'est peut-être ce que je ferai si j'y arrive


RE: [SQL] Vérifier la valeur d'un autre champ dans une clé étrangère - niahoo - 16-07-2011

ça a marché pour l'update sur t2, merci pour le conseil.