Bonjour à tou(te)s,
Je travaille sur un système de demandes où chaque demande doit avoir:
- une date de saisie ("Saisie" )
- un identifiant global unique auto-incrémenté par MySQL ("Id" )
- un identifiant relatif à l'année de saisie ("IdAn" )
Pour calculer l'identifiant relatif à l'année "IdAn" pour une demande donnée, on soustrait le premier "Id" ayant la même année de saisie de l'Id de la demande en question (et on ajoute 1).
Je pourrais faire ça au niveau de mon code PHP, mais je cherche à gérer ça au niveau de MySQL.
Je pourrais intégrer systématiquement une sous-requête du style "SELECT MIN(Id) FROM Demande WHERE YEAR(Saisie) = ...", mais vu le nombre de requêtes de sélection faites, ça ne me semble pas du tout optimal.
Je pourrais me baser sur une vue établissant les correspondances entre les années et les premiers Id des demandes, mais ça ne me semble pas plus optimal.
Je pensais éventuellement à une "vue matérialisée", mais ça me semble un peu lourd à gérer au niveau des mises à jour, et je ne trouve pas ça forcément très élégant.
Le plus optimal me semblait donc être l'ajout d'un champ "IdAn" dans ma table "Demande" : on "doublonne" l'information, donc ce n'est pas très "canonique", mais ça me semble être la solution la plus performante.
Le problème se situe au niveau de la mise à jour du champ.
J'ai essayé de recourir à un trigger:
Code :
- DELIMITER |
- CREATE TRIGGER t_after_insert_id_an AFTER INSERT
- ON Demande FOR EACH ROW
- BEGIN
- SET @id:=NEW.Id;
- SET @an:=( SELECT YEAR(Saisie) FROM Demande WHERE Id = @id );
- SET @mid:=( SELECT MIN(Id) FROM Demande WHERE YEAR(Saisie) = @an );
- SET NEW.IdAn = (@id - @mid + 1)
- END |
- DELIMITER ;
|
Malheureusement, le bousin semble couiner du fait que je lance des sous-requêtes sur la table Demande dans un trigger qui se déclenche après insertion dans cette même table Demande.
Du coup, là, je suis un peu en panne de bonnes idées... En auriez-vous à me soumettre ? Est-ce que vous voyez une autre manière à la fois élégante et performante d'aborder le problème ? Vous remerciant par avance pour vos réponses.