Bonjour,
Dans le cadre d'un projet je suis en train de concevoir une BDD (MySQL 8).

Dans cette base j'ai une table "Seance" qui contient la colonne "seance_position".
A chaque nouvelle insertion dans la table Seance, il faut gérer la position de la nouvelle seance parmi les autres d'un même programme (table "Programme").
Pour celà j'ai conçu un trigger qui gère seance_position.

Il met la position la plus haute si on ne specifie rien ('' ou null). Et cette partie du trigger fonctionne .

Mais si on specifie la position,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
INSERT INTO `seance` (`seance_id`, `seance_nom`, `seance_duree`, `seance_position`, `seance_programme_id`) VALUES (NULL, 'test6', '0', POSITION SPECIFIQUE, '1');
le trigger doit mettre position+1 à toutes les autres seances (du même programme) ayant une position superieure ou égale à celle de l'insertion.

Or, au lancement de cet INSERT, dans ce cas de figure, le trigger ne fonctionne pas et on me renvoie le message d'erreur:
#1442 - Can't update table 'seance' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Je ne comprends pas où est le problème car mon trigger "me semble" cohérent:


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
 
CREATE TRIGGER `seance_before_insert` BEFORE INSERT ON `seance`
FOR EACH ROW 
BEGIN
	DECLARE nb_ligne INT;
	DECLARE max_pos INT;
	SET nb_ligne := (SELECT COUNT(*) FROM Seance WHERE seance_programme_id = NEW.seance_programme_id);
 
	IF (NEW.seance_position = "") THEN
    		-- chaine vide = null
    		SET NEW.seance_position := NULL;
	END IF;
 
	IF NEW.seance_position IS NULL THEN
    		IF (nb_ligne < 1) THEN
        		SET NEW.seance_position = 1;
        	ELSE
        		SET max_pos := (SELECT MAX(seance_position) FROM Seance WHERE seance_programme_id = NEW.seance_programme_id) + 1;
 
            		SET NEW.seance_position := max_pos;
        	END IF;
	ELSE
    		IF (NEW.seance_position > 0) THEN
            		----------------------- ce qui ne fonctionne pas --------------------------
            		UPDATE Seance 
			SET seance_position = seance_position + 1 
			WHERE seance_programme_id = NEW.seance_programme_id
            		AND seance_position >= NEW.seance_position;
            		---------------------------------------------------------------------------
        	ELSE -- position <= 0
        		SIGNAL SQLSTATE "45000" 
			SET MESSAGE_TEXT = "Position 0 est interdit !\nInsertion annulée";
		END IF;
	END IF; 
END
Je me retrouve bien embêté .

Merci d'avance pour vos réponses.