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

SQL Procédural MySQL Discussion :

Trigger update Table


Sujet :

SQL Procédural MySQL

  1. #1
    Débutant  
    Inscrit en
    Mars 2008
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1 123
    Points : 170
    Points
    170
    Par défaut Trigger update Table
    Bonjour,
    j'ai une table personne
    id: auto_increment (Primary Key)
    name: varchar(100)
    matricule: varchar(15)

    comment je peux créer un TRIGGER qui me permet après chaque insertion dans la table personne de faire un UPDATE du matricule
    tel que le matricule =id+"0000MAT"

    Merci à vous

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 243
    Points : 8 522
    Points
    8 522
    Billets dans le blog
    17
    Par défaut
    Il n'y a pas de solution pleinement satisfaisante pour exploiter un auto-incrément à la volée.

    À mon sens cette colonne aurait plutôt sa place dans une vue
    ou, au pire, dans un UPDATE qui suivrait le INSERT :

    INSERT INTO person (name) VALUES ('Valentine');
    UPDATE person SET code = CONCAT(id, '0000MAT') WHERE id = LAST_INSERT_ID();

  3. #3
    Débutant  
    Inscrit en
    Mars 2008
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1 123
    Points : 170
    Points
    170
    Par défaut
    est ce que c'est possible de créer un TRIGGER qui se déclenche automatiquement qui fait le UPDATE

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 243
    Points : 8 522
    Points
    8 522
    Billets dans le blog
    17
    Par défaut
    Oui c'est possible, mais ce n'est pas fiable
    => Voir un trigger BEFORE INSERT qui récupérerait le prochain ID

    Je te laisse la responsabilité de déterminer quel est le prochain ID généré.

    Je maintiens qu'il faut utiliser une vue ou un INSERT+UPDATE (éventuellement à encapsuler dans une procédure/transaction).

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 347
    Points : 39 746
    Points
    39 746
    Billets dans le blog
    9
    Par défaut
    Un identifiant attribué par le SGBD (auto_increment pour MySQL/MariaDB) ne devrait JAMAIS être utilisé comme valeur fonctionnelle.
    Il ne doit avoir qu'un role technique
    Attribuer cette valeur au matricule est une erreur. Si vous avez besoin d'un matricule unique, utilisez simplement une contrainte unique

    EDIT de plus, à propos de ceci :

    Citation Envoyé par sky88 Voir le message
    comment je peux créer un TRIGGER qui me permet après chaque insertion dans la table personne de faire un UPDATE du matricule
    tel que le matricule =id+"0000MAT"
    Mettre une constante dans une colonne n'a aucun intérêt, par définition, la valeur en suffixe ne sera pas discriminante, dons sans intérêt pour les recherches.
    Ce faisant, on encombre inutilement la base de données.
    Si vous voulez une constante en suffixe, il suffit de la construire dans la requête par un CONCAT par exemple au moyen d'une vue si le besoin est récurrent.

  6. #6
    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 483
    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 483
    Points : 19 503
    Points
    19 503
    Par défaut
    Salut à tous.

    Pourquoi se focaliser sur un déclencheur (Trigger) pour réaliser ce genre de concaténation ?

    MySql permet de créer une colonne, résultat de la combinaison de plusieurs colonnes dans un intérêt qui peut-être discutable, comme ici.

    La plupart du temps, il est préférable de créer une view qui permet de gérer ces colonnes qui n'ont pas lieu d'être présent dans une base de données.
    Par exemple, le calcul TTC à partir d'un montant HT où l'on applique une TVA.
    Ou encore, créer une colonne construite à partir d'autres colonnes.
    Cela peut être dû une modélisation mal conçue !

    A titre d'exemple, voici comment créer ce genre de colonne :
    Code mysql : 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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`    integer unsigned                                                                            NOT NULL primary key,
      `mat1`  char(15) generated always as (concat('MAT', right(concat('000000000000',`id`), 12))) stored NOT NULL,
      `name`  varchar(255)                                                                                NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`id`,`name`) VALUES (1,'Un'), (2,'Deux'), (3,'Trois')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-----------------+-------+
    | id | mat1            | name  |
    +----+-----------------+-------+
    |  1 | MAT000000000001 | Un    |
    |  2 | MAT000000000002 | Deux  |
    |  3 | MAT000000000003 | Trois |
    +----+-----------------+-------+
     
    --------------
    drop view if exists `vue`
    --------------
     
    --------------
    create view `vue` as
      select `id`,
             name,
             concat('MAT', right(concat('000000000000',`id`),12)) as mat2
     
        from `test`
    --------------
     
    --------------
    select * from `vue`
    --------------
     
    +----+-------+-----------------+
    | id | name  | mat2            |
    +----+-------+-----------------+
    |  1 | Un    | MAT000000000001 |
    |  2 | Deux  | MAT000000000002 |
    |  3 | Trois | MAT000000000003 |
    +----+-------+-----------------+
     
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Plusieurs remarques :

    a) Avec "generated", on ne peut pas utiliser la colonne "id" auto incrémenté.

    b) il ne faut pas utiliser ce genre de colonne comme identifiant pour accéder à la ligne recherchée.
    Cela occupe de la place mémoire pour rien et est redondant avec la colonne "id" qui existe déjà dans la table.

    c) ne pas confondre un identifiant technique, ici "id" avec un identifiant fonctionnel, de toute évidence, votre colonne "matricule".
    S'il est nécessaire de passer de l'un à l'autre, cela doit se faire d'une manière applicative.

    d) comme le dit Escartefigue, utiliser une constante n'a aucun intérêt fonctionnelle.
    Par contre, si pour une raison quelconque, vous devez créer un matricule en fonctionne du service, cela peut en effet s'envisager.
    Dans ce cas, la clef primaire de votre table est composée de deux colonnes, l'identifiant technique "id" et le service auquel appartient l'employé.

    e) autre problème, celle de la compatibilité ascendante d'une telle solution avec les futurs versions de MySql.
    Et je le rappelle que cette colonne "generated" ne peut pas être modifiée.

    Au lieu de demander une résolution technique d'un problème qui de toute évidence est fonctionnelle, le mieux aurait été de formuler cela sous la forme d'une question. Par exemple, quelle est la meilleure façon de gérer un matricule au sein d'une base de données.

    @+

Discussions similaires

  1. Can't update table in stored function/trigger
    Par LerikalBless dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/06/2015, 15h01
  2. [MySQL-5.5] Trigger table C et update table A
    Par mpintor dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/04/2015, 17h25
  3. [10g] Trigger after update : table mutante
    Par StephSushiSig dans le forum Oracle
    Réponses: 8
    Dernier message: 29/12/2014, 14h37
  4. Can't update table 'article' in stored function/trigger
    Par gentel_man dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 20/03/2012, 13h51
  5. Réponses: 0
    Dernier message: 06/02/2008, 17h09

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