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 21/07/2011, 17h29   #1
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
Par défaut trigger, Champ3 = Champ1 + Champ2

Bonjour

j'aimerai connaitre comment utilisé les triggers pour réaliser des opérations automatiquement sur mes tables.

Exemple j'ai une table "table_somme" avec 4champs : 'id', 'champs1', 'champs2' et 'champs3'

je veux qu'à chaque fois que je donne des valeurs numériques à 'champs1' et 'Champs2' la valeur somme se généré automatiquement dans le 'champs3'

j'ai lu quelques tuto sur les triggers et j'ai essayé ça mai en vin

Code :
1
2
3
4
5
6
 
CREATE TRIGGER calcul;
AFTER INSERT ON table_somme;
BEGIN
SELECT  champs1,Champs2, (Champs1+Champs2) AS champs3 FROM table_somme;
END//


Merci d'avance pour vos réponses.
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 22h35   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
C'est même étonnant que ce trigger soit accepté par MySQL

Commence par vérifier la syntaxe par rapport à cet exemple http://dev.mysql.com/doc/refman/5.0/...-triggers.html
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 23h48   #3
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
Bonsoir

j'avais déjà lu l'exemple que tu m'a donné, il permet de mettre la somme de deux champs dans une variable, j'ai essayé de l'adapter à mon problème c'est pour ça que tu as trouvé la syntaxe un peu bizarre

c'est juste pour bien expliquer ce que je veux faire

j'attends vos réponses ^^ (help plz)
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 09h55   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par escafleak Voir le message
je veux qu'à chaque fois que je donne des valeurs numériques à 'champs1' et 'Champs2' la valeur somme se généré automatiquement dans le 'champs3'
D'abord, les champs sont à la campagne ou dans les formulaires ! Les tables SQL ne sont composées que de clignes et de colonnes !

Ensuite, on ne stocke pas en base de données une valeur aussi facilement calculable. Ta colonne 3 est inutile et contre-performante.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 13h17   #5
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
salut

Citation:
D'abord, les champs sont à la campagne ou dans les formulaires ! Les tables SQL ne sont composées que de clignes et de colonnes !
désolé si je te contredis mais on les appelle aussi (champs et entrées ) les lignes et les colonnes c'est à l'origine pour les tableaux et les matrices

Citation:
on ne stocke pas en base de données une valeur aussi facilement calculable. Ta colonne 3 est inutile et contre-performante
je sais, mais pour faire un truc compliqué faut commencer par un truc simple
en fait je vien de réussir à réaliser ce que je voulais et voici le code :

Code :
1
2
3
4
 
CREATE TABLE table_somme (id int,Champs1 int, Champs2 int, Champs3 int);
CREATE TRIGGER somme BEFORE INSERT ON table_somme
FOR EACH ROW SET new.Champs3= new.Champs1 + new.Champs2;
maintenant j'aimerai faire la même chose sauf que le champs3 appartient à une autre table dans la même base de données.
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 15h02   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par escafleak Voir le message
désolé si je te contredis mais on les appelle aussi (champs et entrées ) les lignes et les colonnes c'est à l'origine pour les tableaux et les matrices
Comment ajoutes-tu "un champ" à une table SQL ?
CQFD !


Citation:
je sais, mais pour faire un truc compliqué faut commencer par un truc simple
en fait je vien de réussir à réaliser ce que je voulais et voici le code :

Code :
1
2
3
4
 
CREATE TABLE table_somme (id int,Champs1 int, Champs2 int, Champs3 int);
CREATE TRIGGER somme BEFORE INSERT ON table_somme
FOR EACH ROW SET new.Champs3= new.Champs1 + new.Champs2;
maintenant j'aimerai faire la même chose sauf que le champs3 appartient à une autre table dans la même base de données.
Ben tu ajoutes une requête INSERT ou UPDATE dans ton trigger. Mais une fois de plus c'est une colonne calculée qui n'a pas à être stockée en BDD !

Bon courage
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 15h38   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par CinePhil Voir le message
Comment ajoutes-tu "un champ" à une table SQL ?
CQFD !
Bon courage
Juste pour le fun,
Comment mettriez vous a jour un "champ" en SQL ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 15h46   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Yanika_bzh Voir le message
Juste pour le fun,
Comment mettriez vous a jour un "champ" en SQL ?
Code :
1
2
3
UPDATE une_table
SET une_colonne = valeur
WHERE condition_de_restriction_sur_la_ou_les_lignes_à_modifier
Pas de champ là dedans !

Ou si on veut modifier la structure de la colonne, et puisqu'on est chez MySQL, la doc dit ceci :
Citation:
MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 15h51   #9
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
salut

bon laissons l’histoire de colonne ou champ a coté et concentrant nous sur le problème et à partir d'aujourd'hui je ne dirais plus "champ"

Citation:
Mais une fois de plus c'est une colonne calculée qui n'a pas à être stockée en BDD !
je ne comprends pas pourquoi tu dis ça !!!!

je veux effectuer des opérations sur les valeurs des 'colonnes' d'une table et stoker les résultats automatiquement dans une autre table .
je veux éviter de faire à chaque fois des calculs avant d'afficher ma table ou il y a les résultats tu vois ?!!

Citation:
Ben tu ajoutes une requête INSERT ou UPDATE dans ton trigger.
ok je vais essayer Merci beacoup
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 15h51   #10
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Donc selon la meme logique, inserer un "champ" devrait s'ecrire

INSERT INTO une_table (MaColonne) values (MaValeur)

non ?

Le "champ" serait donc l'element decrit par l'intersection d'une ligne et d'une colonne, en aucun cas une Colonne, non ?

Autre question fun,
Comment ecririez vous "Supprimer une table" en SQL ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 16h02   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Yanika_bzh Voir le message
Donc selon la meme logique, inserer un "champ" devrait s'ecrire

Code :
INSERT INTO une_table (MaColonne) VALUES (MaValeur)
non ?
Oui.

Citation:
Le "champ" serait donc l'element decrit par l'intersection d'une ligne et d'une colonne, en aucun cas une Colonne, non ?
C'est ce que j'ai écrit parfois dans de précédents messages d'autres discussions pour souligner le mauvais terme champ. Je crois même que j'avais fait une mise à jour de Wikipédia à ce sujet.
L'intersection de la colonne et de la ligne, autrement dit une valeur particulière d'une colonne, peut-être assimilée à la cellule d'une feuille de tableur.

Citation:
Autre question fun,
Comment ecririez vous "Supprimer une table" en SQL ?
Qu'y a t-il de fun ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 16h05   #12
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
A l'instar de votre reflexion dans "update ... Pas de champs de dedans",
Dans
Code :
1
2
 
DROP TABLE laTable
Pas de "Supprimer" dedans ...

CQFD
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 18h06   #13
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
bsalut

voila j'ai essayé ceci mais ça n'a pas marché :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE TABLE test1 (id int, a int, b int)
CREATE TABLE test2 (id int, c int, d int)
 
delimiter //
CREATE TRIGGER calcul before INSERT INTO test1
FOR each row
begin
SET x = new.id;
SET y = new.a + new.b;
SET z = new. - new.b;
INSERT INTO test2(id,c,d) VALUES(x,y,z);
end //
delimiter;
ce trigger n'a pas été accepté par MySQL !!!! des idée ??
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 20h59   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Euh... manque quelque chose là :
new.quoi ? - new.b
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 22h24   #15
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
salut

c'est

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE TABLE test1 (id int, a int, b int)
CREATE TABLE test2 (id int, c int, d int)
 
delimiter //
CREATE TRIGGER calcul before INSERT INTO test1
FOR each row
begin
SET x = new.id;
SET y = new.a + new.b;
SET z = new.a - new.b;
INSERT INTO test2(id,c,d) VALUES(x,y,z);
end //
delimiter;
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 23h25   #16
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Et donc ? Résultat ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 00h05   #17
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
salut

ça ne marche pas on me dis que j'ai une erreur dans ma syntaxe sql.
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 00h33   #18
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
A quel endroit l'erreur ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 12h45   #19
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
Salut

le problème c'est qu'il ne reconnaisse pas les variables x,y et z
j'ai essayé ceci :

Code :
1
2
3
4
5
6
7
 
CREATE TABLE test1 (id1 int, a int, b int)
CREATE TABLE test2 (id2 int, c int, d int)
 
CREATE TRIGGER calcul before INSERT ON test1
FOR each row
INSERT INTO test2(id2,c,d) VALUES(new.id1,new.a+new.b,new.a-new.b);
et y avait aussi une erreur :

Code :
CREATE TRIGGER calcul before INSERT ON test1
et non pas :
Code :
CREATE TRIGGER calcul before INSERT INTO test1
y a t il un moyen d'utilisé des variables ??
escafleak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 13h05   #20
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 3
Points : 3
salut
j'ai fini par résoudre le problème

voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE TABLE test1 (id1 int, a int, b int)
CREATE TABLE test2 (id2 int, c int, d int)
 
delimiter //
CREATE TRIGGER calcul before INSERT ON test1
FOR each row
begin
SET @x = new.id1;
SET @y = new.a + new.b;
SET @z = new.a - new.b;
INSERT INTO test2(id2,c,d) VALUES(@x,@y,@z);
end //
delimiter;
Citation:
Les variables utilisateur sont écrites comme @var_name, où le nom de la variable est var_name
Merci beaucoup pour les conseils et j’espère que cette discussion aidera d'autres personnes

@+
escafleak 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 00h44.


 
 
 
 
Partenaires

Hébergement Web