Bonjour,

J'ai été redirigée sur ce site par un membre d'un Site qui m'a assuré que cette communauté serait plus à même de répondre à mes questions.

Un projet pour un cours de Base de Données me donne du fil à retordre. En effet, nous n'avons vu au cours que les requêtes, et pas du tout la syntaxe des TRIGGER qui sont pourtant bien utiles pour notre projet assez complexe!
Après avoir pioché ici et là des réponses sur l'un ou l'autre tutoriel SQL sur les TRIGGER, les conditions, la gestion des dates,..., voilà le code que j'ai réussi à concocter:
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
delimiter //
 
CREATE TRIGGER visits_insert_t
BEFORE INSERT ON Visits V
FOR EACH ROW
BEGIN
    UPDATE Rollercoasters R
    SET attendance_rate = AVG (visitnbr AS (SELECT COUNT(*) 
					   FROM Visits V1, Rollercoasters R1 
					   WHERE V1.id_attraction=R1.id_attraction 
					   GROUP BY DAY (V1.Entrance_time) AS visitsday))
    WHERE R.id_attraction=NEW.id_attraction; /* A chaque ajout d'une visite, la moyenne journalière des visites est calculée 	et mise dans la table "Rollercoaster" là où l'ID correspond*/
 
    UPDATE Manege M
    SET attendance_rate = AVG (visitnbr AS (SELECT COUNT(*) 
					   FROM Visits V1, Manege M1 
					   WHERE V1.id_attraction=M1.id_attraction 
					   GROUP BY DAY (V1.Entrance_time) AS visitsday))
    WHERE M.id_attraction=NEW.id_attraction; /* Idem précédente pour la table "Manège" Note: un même id ne se retrouvera pas dans les 2 tables*/
 
    CASE WHEN(AttractionTime IS NULL) THEN (UPDATE Queue Q1
						SET NEW.Occupation = OLD.Occupation+1
						WHERE Q1.id_attraction=NEW.id_attraction;/* Ajoute 1 à la file d'attente correspondante lorsque la condition est vérifiée*/
 
						UPDATE Queue Q
						SET Timeperperson = AVG(SELECT (DATEDIFF (mi,NEW.AttractionTime,NEW.QueueEntranceTime)/Q1.Occupation)
										    FROM Visits V1, Queue Q1
										    WHERE V1.id_attraction=Q1.id_attraction)
						WHERE R.id_attraction=NEW.id_attraction; /* Mets à jour le temps d'attente moyen par personne présente dans la file d'attente*/
											)
		ELSE END; 
 
END//
 
CREATE TRIGGER visits_update_t
BEFORE UPDATE ON Visits V
FOR EACH ROW
BEGIN
	CASE WHEN(OLD.AttractionTime IS NULL AND NEW.AttractionTime IS NOT NULL) 
	THEN (UPDATE Queue Q
	         SET NEW.Occupation = OLD.Occupation-1
	         WHERE Q.id_attraction=V.id_attraction; /* Retire 1 à la file d'attente correspondante lorsque la condition est vérifiée*/ 
	         )
	ELSE END;
 
END//
 
delimiter ;
En gros, ça servirait à modifier des statistiques au sein d'autres tables, et d'incrémenter/décrémenter une file d'attente lorsque des visites ont lieu dans un parc d'attraction.

C'est surtout au niveau de la structure conditionnelle que je ne me sens pas à l'aise, le ELSE est-il nécessaire même si aucune action n'est demandé dans un autre cas que celui évoqué (je n'ai pas trouvé de cas similaire dans les tutos consultés)?
D'une manière générale, ai-je utilisé correctement le langage SQL?

Merci d'avance pour les remarques que vous pourrez me faire!

Cecolympe

EDIT: Bon, j'ai déjà trouvé beaucoup d'erreurs par moi-même et grâce à l'aide de la communauté des Zéros, je mettrai mon code pré-corrigé dans un autre post.