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 :

Retourner les id des lignes modifiées


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Retourner les id des lignes modifiées
    Bonjour,

    Je suis développeur depuis 2004 et c'est la première fois que je publie sur un forum car je n'arrive pas à trouver l'information et j'ai peur que ce que je demande soit impossible.

    J'aimerai en une seule et même requête faire un UPDATE et que les id de ces lignes me soient retournées

    La requête ci-dessous est fausse et ne fonctionne pas mais c'est pour vous expliquer ce que je désir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id
    FROM `ma_table`
    WHERE UPDATE `ma_table`
    SET `mon_champs` =  'modification'
    WHERE `age` > 25
    Si la méthode trouvé fonctionne aussi pour INSERT et DELETE, c'est encore plus génial.

    Un grand merci d'avance à vous.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si tu créais une table temporaire sélectionnant les enregistrements que tu modifieras/ajouteras/supprimeras ?

    Cordialement,

  3. #3
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ça ne résout pas mon problème qui est d'avoir une seule et unique requête SQL alors que normalement 2 requêtes minimum sont requis pour cette opération.

    Si je créé une autre table ou une colonne en plus pour ajouter la date de modification afin de me faciliter la récupération des éléments modifiés, je suis toujours obligé de faire ma requête UPDATE et ensuite ma requête SELECT.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Avec mon habitude de n'utiliser que des proc stock, j'oublie de le préciser !

    C'est très succinct car je ne connais pas ta structure de table mais qq chose dans ce genre :

    CREATE TEMPORARY TABLE TmpLesEnrAModifier AS SELECT
    ;

    UPDATE
    ...
    WHERE
    xxx = IDTmpLesEnrAModifier
    ;

    SELECT
    IDTmpLesEnrAModifier
    FROM
    TmpLesEnrAModifier
    ;# -> Ce qui sera retourné par ta proc stock

    DROP TEMPORARY TABLE TmpLesEnrAModifier;

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par netplusmedia Voir le message
    ça ne résout pas mon problème qui est d'avoir une seule et unique requête SQL alors que normalement 2 requêtes minimum sont requis pour cette opération.

    Si je créé une autre table ou une colonne en plus pour ajouter la date de modification afin de me faciliter la récupération des éléments modifiés, je suis toujours obligé de faire ma requête UPDATE et ensuite ma requête SELECT.
    Si vous utilisiez SQL Server, vous pourriez utiliser la clause OUTPUT... Malheureusement MySQL ayant a peu près 20 ans de retard en matière de SQL ceci n'est absolument pas possible...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    nenex73 : je n'ai pas testé ta solution mais il y a plusieurs requête dans ta solution hélas.

    SQLpro : j'avais trouvé OUTPUT, j'ai testé et je suis suis rendu compte que ça ne fonctionnait que sur SQL server effectivement et j'utilise MySQL, par défaut sur OVH. Je regarderai si SQL server est dispo chez eux.

    Merci beaucoup à vous deux.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Tu ne peux pas faire de proc stock ?
    Car si tu peux tu te contenteras d'un CALL pcdMaProcStockQueJAime() et elle te retournera les ID (ou autre) des enr. ajoutés/modifiés/supprimés en retour.
    C'est vraiment très simple.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par netplusmedia Voir le message
    nenex73 : je n'ai pas testé ta solution mais il y a plusieurs requête dans ta solution hélas.

    SQLpro : j'avais trouvé OUTPUT, j'ai testé et je suis suis rendu compte que ça ne fonctionnait que sur SQL server effectivement et j'utilise MySQL, par défaut sur OVH. Je regarderai si SQL server est dispo chez eux.

    Merci beaucoup à vous deux.
    Sinon, il me semble que PG fait cela aussi mais par le fastidieux biais d'un truc imbitable appelé Writable CTE

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Invité
    Invité(e)
    Par défaut
    Désolé d'insister netplusmedia mais du côté applicatif (d'ailleurs tu ne nous a pas dit en quoi tu programmais) IL N'Y A QU'UN APPEL : CALL pcdMaProcStockQueJAime()
    Que tu vas gentiment parcourir comme pour un SELECT.
    Les requêtes sont "encapsulées".

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    J'ai utilisé deux méthodes pour atteindre le but demandé par 'netplusmedia'.

    1) soit la solution de nenex73 qui consiste à créer une procédure stockée contenant une table temporaire.
    2) soit par un trigger.

    Mais je trouve cela lourd comme façon de faire, juste pour connaitre les identifiants des lignes modifiées.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (
      `id`       integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `libelle`  char(20)          NOT NULL,
      `age`      integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`libelle`,`age`) values ('un', 33),('deux', 16),('trois',12),('quatre',47)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+---------+-----+
    | id | libelle | age |
    +----+---------+-----+
    |  1 | un      |  33 |
    |  2 | deux    |  16 |
    |  3 | trois   |  12 |
    |  4 | quatre  |  47 |
    +----+---------+-----+
    --------------
    DROP PROCEDURE IF EXISTS identify_1
    --------------
     
    --------------
    CREATE PROCEDURE identify_1 ()
    DETERMINISTIC
    NO SQL
    BEGIN
       DECLARE _id      INTEGER DEFAULT 0;
       DECLARE _fin     INTEGER DEFAULT 1;
       DECLARE _tab     CURSOR  FOR SELECT id from test where age > 25;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
       CREATE TEMPORARY TABLE `temp_id`
       ( `id` INTEGER UNSIGNED PRIMARY KEY
       ) engine=InnoDB;
     
    OPEN _tab;
    FETCH _tab INTO _id;
     
    WHILE (_fin)
    DO
      UPDATE `test` SET libelle='modification' where id=_id;
      INSERT INTO `temp_id` (`id`) values (_id);
      FETCH _tab INTO _id;
    END WHILE;
     
    SELECT id from temp_id;
    DROP TABLE `temp_id`;
    END
    --------------
     
    --------------
    CALL identify_1()
    --------------
     
    +----+
    | id |
    +----+
    |  1 |
    |  4 |
    +----+
    --------------
    select * from test
    --------------
     
    +----+--------------+-----+
    | id | libelle      | age |
    +----+--------------+-----+
    |  1 | modification |  33 |
    |  2 | deux         |  16 |
    |  3 | trois        |  12 |
    |  4 | modification |  47 |
    +----+--------------+-----+
    --------------
    drop table `temp_id2`
    --------------
     
    ERROR 1051 (42S02) at line 90: Table 'base.temp_id2' inconnue
    --------------
    CREATE TABLE `temp_id2`
    ( `id` INTEGER UNSIGNED PRIMARY KEY
    ) engine=InnoDB
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS identify_2
    --------------
     
    --------------
    CREATE TRIGGER identify_2
    BEFORE UPDATE ON `test`
    FOR EACH ROW BEGIN
      DECLARE _id INTEGER DEFAULT 0;
      SELECT id INTO _id FROM test WHERE age=old.age;
      INSERT    INTO `temp_id2` (`id`) VALUES (_id);
    END
    --------------
     
    --------------
    TRUNCATE TABLE temp_id2
    --------------
     
    --------------
    update `test` set libelle='blablabla' where age>25
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-----------+-----+
    | id | libelle   | age |
    +----+-----------+-----+
    |  1 | blablabla |  33 |
    |  2 | deux      |  16 |
    |  3 | trois     |  12 |
    |  4 | blablabla |  47 |
    +----+-----------+-----+
    --------------
    select * from temp_id2
    --------------
     
    +----+
    | id |
    +----+
    |  1 |
    |  4 |
    +----+
    --------------
    DROP TABLE `temp_id2`
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/01/2007, 13h33
  2. [XMLSpy] voir les N° des lignes de code
    Par t-die dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/11/2006, 13h28
  3. Comment changer les couleurs des lignes avec displaytag
    Par rlnd23 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/10/2006, 13h52
  4. Réponses: 1
    Dernier message: 07/09/2006, 19h56
  5. Alterner les couleurs des lignes d'un tableau
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/06/2006, 21h13

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