Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/08/2007, 11h44   #1
Futur Membre du Club
 
Inscription : mai 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 30
Points : 16
Points : 16
Par défaut Trigger Before Insert et Before Update

Bonjour,

Je suis actuellement confronté à un phénomène inattendu en utilisant les triggers avec une table de test sous MySQL 5.0.

Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE test_trigger (
 id int UNSIGNED NOT NULL AUTO_INCREMENT,
 code varchar(30) NOT NULL,
 date_creation timestamp NOT NULL,
 date_maj timestamp NOT NULL,
 PRIMARY KEY(id),
 KEY(code)
) ;
Je crée deux triggers très simples permettant les mise à jour des champs date sur l'insertion et la mise à jour de l'enregistrement.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DELIMITER //
CREATE TRIGGER d_bi_test_trigger BEFORE INSERT ON test_trigger FOR EACH ROW
BEGIN
  SET new.date_creation = Now() ;
  SET new.date_maj = Now() ;
END //
DELIMITER ;
 
DELIMITER //
CREATE TRIGGER d_bu_test_trigger BEFORE UPDATE ON test_trigger FOR EACH ROW
BEGIN
  SET new.date_maj = Now() ;
END //
DELIMITER ;
Ensuite, j'exécute une insertion.

Code :
INSERT INTO test_trigger(code) VALUES ('Objet1') ;
Le résultat est conforme à ce qui est attendu :
Code :
1
2
3
4
5
6
 
+----+--------+---------------------+---------------------+
| id | code   | date_creation       | date_maj            |
+----+--------+---------------------+---------------------+
|  1 | Objet1 | 2007-08-13 11:34:54 | 2007-08-13 11:34:54 |
+----+--------+---------------------+---------------------+
Ensuite, je fais une mise à jour de cet enregistrement.

Code :
UPDATE test_trigger SET code='Objet2' WHERE code='Objet1' ;
Et le résultat est le suivant:

Code :
1
2
3
4
5
6
 
+----+--------+---------------------+---------------------+
| id | code   | date_creation       | date_maj            |
+----+--------+---------------------+---------------------+
|  1 | Objet2 | 2007-08-13 11:35:25 | 2007-08-13 11:35:25 |
+----+--------+---------------------+---------------------+
En résumé mon déclencheur sur l'update semble avoir effectué les mêmes actions que mon déclencher sur l'insert, c'est-à-dire la maj de la "date de maj" et de la "date_creation"

Etonnant, non ?

Merci d'avance pour vos avis éclairés...
NicoNours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 16h37   #2
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...

j´ai une solution, mais....

Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE test.test_trigger (
 id int UNSIGNED NOT NULL AUTO_INCREMENT,
 code varchar(30) NOT NULL,
 date_creation datetime ,
 date_maj datetime ,
 PRIMARY KEY(id),
 KEY(code)
) ;
au lieu de timestamp, mais datetime....



mais j´arrive pas a comprendre pourquoi ca marche pas avec timestamp...

si quelqun d´autre a une idee.
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 18h09   #3
Futur Membre du Club
 
Inscription : mai 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 30
Points : 16
Points : 16
Cela me semble effectivement une bonne idée d'être allé rechercher de ce côté. On dirait que le timestamp possède un statut plus que particulier.

On a un article intéressant qui traite de ce sujet :

Two auto-TIMESTAMP columns in one table with MySQL 5.0

Je vais essayer de l'exploiter et de voir ce que cela change sur mon modèle initial.
NicoNours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 09h16   #4
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Je crois que les colonnes de type timestamp se mettent à jour automatiquement, du moins la première par défaut. Pour plus d'infos, voici la doc MySQL sur le type timestamp : date-time
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 10h20   #5
Futur Membre du Club
 
Inscription : mai 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 30
Points : 16
Points : 16
Par défaut Travail

J'ai donc adapté à mon exemple la méthode proposée dans l'article que j'ai cité plus haut. Cela donne :

Code :
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
 
CREATE TABLE test_trigger (
 id int UNSIGNED NOT NULL AUTO_INCREMENT,
 code varchar(30) NOT NULL,
 date_creation timestamp NULL DEFAULT NULL,
 date_maj timestamp NULL DEFAULT NULL,
 PRIMARY KEY(id),
 KEY(code)
) ;
 
DELIMITER //
CREATE TRIGGER d_bi_test_trigger BEFORE INSERT ON test_trigger FOR EACH ROW
BEGIN
  SET NEW.date_creation = IFNULL(NEW.date_creation,NOW()) ;
  SET NEW.date_maj = IFNULL(NEW.date_maj, '0000-00-00 00:00:00');
END //
DELIMITER ;
 
DELIMITER //
CREATE TRIGGER d_bu_test_trigger BEFORE UPDATE ON test_trigger FOR EACH ROW
BEGIN
  SET NEW.date_maj = IF(NEW.date_maj = OLD.date_maj OR NEW.date_maj IS NULL, NOW(), NEW.date_maj);
  SET NEW.date_creation = IFNULL(NEW.date_creation, OLD.date_creation);
END //
DELIMITER ;
On obtient bien au final après une insertion puis une mise à jour deux dates différentes bien qu'on ait choisi le format timestamp.

Néanmoins, cette méthode ne brille pas par sa simplicité et on préférera donc l'utilisation des datetime à moins que l'on n'ait absolument besoin des timestamp.
NicoNours est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h26.


 
 
 
 
Partenaires

Hébergement Web