IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

UPDATE sur table liées


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 54
    Par défaut UPDATE sur table liées
    Bonjour,

    Je débute MYSQL donc il est possible que ce que je veuille est impossible.

    J'ai deux tables, la première (fiche) contient les informations de base sur une personne (nom, prénom, adresse, ...) et la deuxième (datpro) contient elle des données salariales ainsi que les dates d'entrée et de sortie au sein de l'entreprise.

    Ces deux tables sont lièes par leur clé primaire (num_registre) et pour afficher la fiche complète d'une personne donnée j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM fiche f, datpro d WHERE f.`num_registre` = d.`num_registre`
    Ce que je voudrais c'est pouvoir faire un UPDATE de l'enregistrement que je viens de ramener avec SELECT.

    Je vois à peu près ce qu'il faudrait faire, en gros stocker le contenu du SELECT dans un tableau et rappeler le contenu de ce tableau lors de l'UPDATE.

    Sauf que je ne sais pas par quel bout commencer

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    Tout d'abord, la syntaxe normalisée depuis 1992 pour les jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM TableA
    JOIN TableB ON condition de jointure
    Ta requête devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM fiche AS f
    INNER JOIN datpro AS d ON f.num_registre = d.num_registre
    Venons-en à ta demande :
    Ce que je voudrais c'est pouvoir faire un UPDATE de l'enregistrement que je viens de ramener avec SELECT.
    Ta requête utilise deux tables or il est impossible de modifier deux tables avec une seule requête. Sauf à utiliser des vues modifiables mais je crois que c'est impossible avec MySQL.

    Si la modification donnée par l'utilisateur dans le logiciel applicatif qui utilise la BDD porte sur la table datpro, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE datpro
    SET laColonne = nouvellevaleur
    WHERE num_registre = le numéro de la personne concernée par la modification
    Si elle porte sur la table fiche, c'est le même principe.
    Si elle porte sur les deux tables, il faut que le programme lance les deux requêtes successivement.

    Mais là on sort du cadre MySQL pour toucher au langage de programmation de l'interface.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 54
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tout d'abord, la syntaxe normalisée depuis 1992 pour les jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM TableA
    JOIN TableB ON condition de jointure
    La faute à OpenOffice
    Ta requête utilise deux tables or il est impossible de modifier deux tables avec une seule requête. Sauf à utiliser des vues modifiables mais je crois que c'est impossible avec MySQL.
    Je m'en doutais

  4. #4
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 878
    Par défaut
    Tu peux le faire en utilisant des procédures stockées
    http://ftp.tuwien.ac.at/db/MySQL/doc...procedure.html

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 54
    Par défaut
    Citation Envoyé par kain_tn Voir le message
    Tu peux le faire en utilisant des procédures stockées
    Donc si je comprend bien je modifie mon code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    delimiter |
    CREATE PROCEDURE modif
    BEGIN
      SELECT f.nom, f.prenom, f.rue, f.code_postal, f.ville
      FROM fiche AS f
      INNER JOIN datpro AS d ON f.num_registre = d.num_registre
      WHERE f.nom = 'tartempion'
    END
    |
     
    CALL modif|
     
    SELECT modif|
    Ca c'est uniquement pour l'affichage de l'enregistrement à modifier.

  6. #6
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 878
    Par défaut
    Non, pour retourner un SET il te faudrait plutôt employer une FUNCTION plutôt qu'une PROCEDURE.


    Je voyais un truc dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
     
    DELIMITER !
    CREATE PROCEDURE `mabase`.`proc_update_lie`(
    	OUT	ret			VARCHAR(5),
    	OUT	error		VARCHAR(255)
    )
    SQL SECURITY INVOKER
    BEGIN
     
    	DECLARE EXIT HANDLER FOR SQLEXCEPTION
    	BEGIN
    		ROLLBACK;
    		SET ret = 'error';
    		SET error = CONCAT('Error in procedure proc_update_lie');
    	END;
     
    	-- Init
    	SET ret = 'error';
     
    	START TRANSACTION;
     
    	UPDATE fiche SET (/*tes colonnes ici*/) VALUES (/*leur valeur là*/)
    		WHERE /*la colonne identifiant là*/ IN (
    										SELECT /*la colonne identifiant là*/ 
    										FROM fiche f, datpro d 
    										WHERE f.`num_registre` = d.`num_registre`
    									);
     
    	UPDATE datpro SET (/*tes colonnes ici*/) VALUES (/*leur valeur là*/)
    		WHERE /*la colonne identifiant là*/ IN (
    										SELECT /*la colonne identifiant là*/ 
    										FROM fiche f, datpro d 
    										WHERE f.`num_registre` = d.`num_registre`
    									);
     
    	COMMIT;
     
    	-- Everything OK
    	SET ret = 'ok';
    END!
    DELIMITER ;
    Et un truc du style pour l'exécuter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL mabase.proc_update_lie();

Discussions similaires

  1. Requête sur table liée non nulle
    Par MistyMan dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/02/2009, 12h44
  2. [WD12] Modification sur table liée
    Par Ninou's DEV dans le forum WinDev
    Réponses: 5
    Dernier message: 19/12/2008, 11h03
  3. ajout enregistrement sur table liée en DAO
    Par pedro91 dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/08/2008, 23h04
  4. [Formulaire] recherche sur tables liées
    Par djudju2000 dans le forum IHM
    Réponses: 2
    Dernier message: 13/02/2007, 10h38
  5. Query sur table liée
    Par pierrot67 dans le forum Bases de données
    Réponses: 9
    Dernier message: 25/10/2006, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo