Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 22/03/2011, 12h32   #1
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Par défaut Trigger : incrémenter un champ selon un autre champ

Bonjour à tous et à toutes,

J'aimerai savoir s'il est possible d'incrementer un champ selon la valeur d'un autre champ avec un trigger!

Je possede une table 'maj_table' qui contient 3 champs: id, id_maj, table_maj

A chaque fois qu'une application est exécuté, des tables sont mis à jour et ajouté dans ma table 'maj_table'. La dernière table ajoutée est toujours la même (appelons la 'jouet'). Ce que j'aimerai c'est que la valeur du champ id_maj soit incrémenté à chaque execution de mon application.

Voici un résultat que j'aimerai avoir:
Code :
1
2
3
4
5
6
7
8
9
10
id     id_maj    table_maj
1      1          basket
2      1          foot
3      1          commandes
4      1          livraisons
5      1          jouet
6      2          commandes
7      2          livraisons
8      2          livraisons_retour
9      2          jouet
Donc, en réalité à chaque fois que je rencontre 'jouet' dans le champs table_maj, j'incrémente le champ id_maj.


Quelqu'un aurait une idée ?

Merci d'avance
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 17h05   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

pour commencer, à ta place, je créerais une table pour referencer les tables :
Citation:
T_TABLE
IDTable----NomTable
1 ----- commandes
2 ----- livraisons
3 ----- jouet
...
et j'utiliserais l'id dans ta table maj_table au lieu du nom
ça évitera des erreurs (genre un même table orthographiée de deux façons différentes : livraison/livraisons)
Et en plus cela améliorera les performances (le SGBDR travaillera sur des entier au lieu de chaines de caracteres...)

Ensuite, j'éviterais de passer par un trigger pour faire ce que tu veux.
dans la table maj_table, je mettrais trois colonnes :
1/ idMaj_Table
2/ dateheure
3/ idTable

avec une simple requête utilisant une fonction de fenêtrage, tu pourras connaitre la version de mise a jour :
Code SQL :
1
2
3
4
5
6
7
8
9
 
SELECT 
	IDTable, 
	dateheure, 
	ROW_NUMBER() OVER (
		PARTITION BY IDTable 
		ORDER BY Dateheure
	) AS NumMaj
FROM maj_table

deux questions :
1/ pourquoi veux-tu faire cela(à quoi doit te servir id_maj par la suite) ?
2/ quel est ton SGBDR ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 18h03   #3
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Merci de ta réponse.
1) Ceci me permet de gérer des script de synchronisation. Ainsi si il y a une erreur dans mes script je pourrait connaitre à quel moment (avec id_maj) et sur quel table il y a eu une erreur. il est donc plus simple de corriger l'erreur.

2) J'utilise MySQL
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h00   #4
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
A quoi sert ceci:

Code :
1
2
3
4
5
 
ROW_NUMBER() OVER (
		PARTITION BY IDTable 
		ORDER BY Dateheure
	) AS NumMaj
De plus, il n'est donc pas possible de passer par des triggers (du moins vous me le déconseillez).

J'ai avancer dans mon problème d'une autre manière qui fonctionne presque mis à part un gros détail :p

En faite j'ai créé une table stockant l'id_maj. J'aimerai qu'à chaque mis à jour (rencontre de la table 'jouet') je fais un update sur cette table pour incrémenter l'id qui me servira à faire mon insert par la suite.
(
L'idée de base etant de faire un trigger sur la table maj_table qui updatera la table contenant l'id_maj si le champ table_maj inséré a pour valeur 'jouet'
)

Avez vous une idée ou savait vous comment programmé l'idée en vert? (peut être que c'est la même mais je n'ai pas bien compris l'idée de la partition )
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h17   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Cela sert à avoir le "numero de ligne" dans une fenêtre donnée, ici le numero de ligne est propre à chaque IDTable et ordonné selon la date et l'heure...

Mais MySQL n'implémente pas ce type de fonction...

mais pourquoi ne pas stocker simplement la date de mise à jour. cela te donnera suffisamment d'informations pour le débogage...

Sinon, pour continuer sur ton idée de seconde table :
ton application, avant de mettre à jour les tables, crée une ligne dans cette table et récupère l'ID autoincrémenté, pour l'inserer dans la table maj_table à chaque fois qu'elle met a jour une table. Pas besoin de trigger. En plus, s'appuyer sur le nom de la "dernière" table mise à jour, ça risque de rendre la maintenance compliquée...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 16h51   #6
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Merci pour ton aide, je vais m'en inspirer

Citation:
mais pourquoi ne pas stocker simplement la date de mise à jour. cela te donnera suffisamment d'informations pour le débogage...
Car je ne fais pas qu'une synchronisation par jour mais des 10ène
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 16h54   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
heu... oui !

Par date, je sous entendais éventuellement les heures aussi, les minutes, les seconde, voire les millisecondes si besoin
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 17h19   #8
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
si je prend en compte les secondes, j'aurai zapper plusieurs mis à jours (imaginons que l'utilisateur clique 2 fois sur mis à jours).

Cependant, j'ai trouvé une solution simple :
Code :
1
2
3
4
5
6
7
8
9
 
UPDATE correl
		SET id = (SELECT id + 1)
		WHERE id = (SELECT id) -- ne sert peut être à rien
		AND id IN
		(SELECT maj_table.id_maj
		FROM maj_table
		WHERE maj_table.TABLE = "jouet"
		AND maj_table.id_maj = id)
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 17h40   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573


Effectivement, le WHERE ne sert à rien, puisqu'il sera toujours vrai
et je ne suis pas sur de bien comprendre le but de tout ça...

au pire, pourquoi ne pas gérer dans votre application : quand vous insérez votre ligne dans table_maj :
Code SQL :
1
2
3
4
5
 
INSERT INTO table_maj (id_maj, table_maj)
SELECT COALESCE(MAX(id_maj), 0) + 1, 'leNomDeLaTable'
FROM maj_table
WHERE table_maj = 'jouet'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/03/2011, 18h26   #10
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Oui merci ca pourrait aussi fonctionner. Je vais essayer de l'integrer.
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 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 23h26.


 
 
 
 
Partenaires

Hébergement Web