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,
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:
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.
Partager