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

MySQL Discussion :

Problème de creation de trigger Alpha Numérique en MYSQL


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut Problème de creation de trigger Alpha Numérique en MYSQL
    Bonsoir j'ai un petit problème. Je voudrais crée un trigger qui vas me permettre d' auto incrémenté ma table Equipement mais je voudrais que le soit EQUI1 ,EQUI2 ,EQUI3 .........
    je voudrais un trigger qui me renvoyer la partir numérique et ensuite dans le code je vais ajouter la EQUI a l'insertion voici le trigger que j'ai essaye de constituer mais ça ne fonction pas.
    Merci pour votre Aide

    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
    DELIMITER //
    CREATE trigger Trg_IDXEQUIPEMENT 
    after insert on equipement
     for each row 
     begin
      declare NUMCPTEQUI smallint ;
       set @NUMCPTEQUI := (select NUMCPTEQUIPEMENT from idxequipement) ;
       DELETE FROM idxequipement;
      if (NUMCPTEQUI = 0 ) then 
      begin
       set NUMCPTEQUI = 1 ;
       insert into idxequipement (NUMCPTEQUIPEMENT) values (NUMCPTEQUI) ;
      end; 
       Else
       begin
       set NUMCPTEQUI = NUMCPTEQUI + 1 ;
       insert into idxequipement (NUMCPTEQUIPEMENT) values (NUMCPTEQUI) ;
       end;
       end //

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonel098.

    Tu te compliques bien l'existence. Inutile de créer une table pour te restituer la valeur de ton auto incrément.
    Tu as pour cela la colonne "auto_increment", comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AUTO_INCREMENT as last_id
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_name = 'test';
    Ensuite, dans une table qui utilise l'auto increment, sur la colonne 'id' par exemple, et bien, tu laisses mysql se charger de l'incrémenter tout seul.
    Autrement dit, tu ne renseignes pas cette colonne.

    Autre cas, peut-être le tien. Tu veux incrémenter la colonne 'num', sachant que sur la colonne 'client', tu as des doublons.
    Pour une valeur donnée, le premier doublon aura 1, le deuxième 2, le troisième 3, et ainsi de suite.
    Voici un exemple qui te sera utile :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `utf8`
            DEFAULT COLLATE       `utf8_general_ci`
    --------------
     
    --------------
    CREATE TABLE `test` (
            id     int      NOT NULL AUTO_INCREMENT,
            client char(10) NOT NULL,
            num    int      NOT NULL,
            PRIMARY KEY (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
            ROW_FORMAT=COMPRESSED
            AUTO_INCREMENT = 1
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `incrementer`
    --------------
     
    --------------
    CREATE TRIGGER `incrementer`
    BEFORE INSERT ON `test`
    FOR EACH ROW BEGIN
       SET NEW.num=ifnull((select max(num)+1 from test where client=NEW.client),1);
    END
    --------------
     
    --------------
    insert into `test` (`client`) values
    ('alpha'),('beta'), ('gamma'),('alpha'),('alpha'),('beta'),
    ('alpha'),('gamma'),('gamma'),('beta'), ('gamma'),('gamma')
    --------------
     
    --------------
    select * from  `test`
    --------------
     
    +----+--------+-----+
    | id | client | num |
    +----+--------+-----+
    |  1 | alpha  |   1 |
    |  2 | beta   |   1 |
    |  3 | gamma  |   1 |
    |  4 | alpha  |   2 |
    |  5 | alpha  |   3 |
    |  6 | beta   |   2 |
    |  7 | alpha  |   4 |
    |  8 | gamma  |   2 |
    |  9 | gamma  |   3 |
    | 10 | beta   |   3 |
    | 11 | gamma  |   4 |
    | 12 | gamma  |   5 |
    +----+--------+-----+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Salut Merci pour ta reponse Artemus24
    Mais le problème ici est sur ma fiche j'enregistre plusieurs Table au moment dont la clé Incrémenté va se sauvegarder dans un association qui devient Table donc je dois avoir la valeur de l’auto-Incrémente doit êtes récupérer avant l'enregistrement.

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut Colonel098.

    J'ai quelques difficultés à comprendre ce que tu cherches à faire.
    Je pense avoir compris que tu recherches la valeur du prochain auto incrément de ta table avant d'insérer une nouvelle ligne.

    Voici un exemple :
    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
    --------------
    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`  int      NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `lib` char(10) NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`lib`) values ('un'),('deux'),('trois')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+
    | id | lib   |
    +----+-------+
    |  1 | un    |
    |  2 | deux  |
    |  3 | trois |
    +----+-------+
    --------------
    SELECT AUTO_INCREMENT as last_id
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_schema = 'base'
    and   table_name   = 'test'
    --------------
     
    +---------+
    | last_id |
    +---------+
    |       4 |
    +---------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Inutile de créer une table pour stocker la valeur de ton auto incrément.
    Cette information existe déjà dans mysql. Il suffit d’interroger la table qui se trouve dans la base pour obtenir l'information.
    De plus, cela devra se faire sur chaque table avant l'insertion, si tu as besoin de récupérer cet incrément.

    @+

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Oui c'est ceux que je cherche un valeur Auto-Incrementé avec les caractère alphabétique exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     TABLE Etudiant
    Create table Etudiant (
    IDE varchar not null primary key ,
    NOME varchar 50 
    )
    et comment exemple 
    ID  ----------- NOME-----------
    EDT1 --------- PIERRE----------
    EDT2---------- DUBOIS ---------
    EDT3 ---------- CRUSE ---------

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonne098.

    Voici ton exemple :
    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
    --------------
    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`      char(10) NOT NULL PRIMARY KEY,
      `nome` varchar(255) NOT NULL,
      `num`  int          NOT NULL AUTO_INCREMENT,
      UNIQUE INDEX (`num`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `increment`
    --------------
     
    --------------
    CREATE TRIGGER `increment`
    BEFORE INSERT ON `test`
    FOR EACH ROW
    BEGIN
      DECLARE _num  int  DEFAULT NULL;
     
      select max(num) into _num from test;
     
      set _num = IFNULL(_num+1, 1);
     
      set new.id = concat('edt', right(concat('0000000000', cast(_num as char(10))), 7));
    END
    --------------
     
    --------------
    insert into `test` (`nome`) values ('pierre')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('paul')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('jacques')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('marcel')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('jean')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('françois')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('léon')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('maurice')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('alfred')
    --------------
     
    --------------
    insert into `test` (`nome`) values ('marius')
    --------------
     
    --------------
    select * from test
    --------------
     
    +------------+----------+-----+
    | id         | nome     | num |
    +------------+----------+-----+
    | edt0000001 | pierre   |   1 |
    | edt0000002 | paul     |   2 |
    | edt0000003 | jacques  |   3 |
    | edt0000004 | marcel   |   4 |
    | edt0000005 | jean     |   5 |
    | edt0000006 | françois |   6 |
    | edt0000007 | léon     |   7 |
    | edt0000008 | maurice  |   8 |
    | edt0000009 | alfred   |   9 |
    | edt0000010 | marius   |  10 |
    +------------+----------+-----+
    --------------
    SELECT AUTO_INCREMENT as last_id
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_schema = 'base'
    and   table_name   = 'test'
    --------------
     
    +---------+
    | last_id |
    +---------+
    |      11 |
    +---------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut Colonne098.

    Je suis sous MySql 5.7.10.
    J'ai une autre solution sans passer par un trigger.

    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
    --------------
    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,
      `rang`  char(10) as (concat('edt', right(concat('0000000', cast(id as char(10))),7))) stored,
      `val`   char(10) NOT NULL,
      PRIMARY KEY (`id`),
      unique index (`rang`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`id`,`val`) values
      (1,'un'),(2,'deux'),(3,'trois'),(4,'quatre'),(5,'cinq'),(6,'six'),(7,'sept'),(8,'huit'),(9,'neuf'),(10,'dix')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+--------+
    | id | rang       | val    |
    +----+------------+--------+
    |  1 | edt0000001 | un     |
    |  2 | edt0000002 | deux   |
    |  3 | edt0000003 | trois  |
    |  4 | edt0000004 | quatre |
    |  5 | edt0000005 | cinq   |
    |  6 | edt0000006 | six    |
    |  7 | edt0000007 | sept   |
    |  8 | edt0000008 | huit   |
    |  9 | edt0000009 | neuf   |
    | 10 | edt0000010 | dix    |
    +----+------------+--------+
    --------------
    describe test
    --------------
     
    +-------+------------------+------+-----+---------+------------------+
    | Field | Type             | Null | Key | Default | Extra            |
    +-------+------------------+------+-----+---------+------------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    |                  |
    | rang  | char(10)         | YES  | UNI | NULL    | STORED GENERATED |
    | val   | char(10)         | NO   |     | NULL    |                  |
    +-------+------------------+------+-----+---------+------------------+
    --------------
    select * from test where rang = 'edt0000005'
    --------------
     
    +----+------------+------+
    | id | rang       | val  |
    +----+------------+------+
    |  5 | edt0000005 | cinq |
    +----+------------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  8. #8
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Merci pour le Code je l'ai testé mais il y a un petit soucis. Les soucis est que je voudrais enregistrer de table sur une même fiche j'utilise la méthode des transactions
    donc tant que les deux tables ne sont pas correct aucun Enregistrement ne doit êtes possible mais dans les deux table j'ai une table qui migre dans un autre donc le code de la première table doit être récupérer avant l'enregistrement des deux tables.
    voici le MLDR
    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
    CREATE TABLE CARACTERISTIQUE(
            IDCARAC           Smallint NOT NULL ,
            SYSTEMECARAC      Varchar (20) ,
            PROCESSEURCARAC   Varchar (20) ,
            TAILLEECRANCARAC  Varchar (10) ,
            TAILLEDISQUECARAC Varchar (25) ,
            RAMCARAC          Varchar (10) ,
            PUISSANCECARA     Varchar (50) ,
            NBEPOSTECARAC     Smallint ,
            TYPEIMPRICARAC    Varchar (15) ,
            TYPERESEAUCARAC   Varchar (25) , 
    		PABXCARAC         VARCHAR (25) ,
    		SUPPCARAC         INTEGER ,
            PRIMARY KEY (IDCARAC )
    )ENGINE=InnoDB;
     
     
    CREATE TABLE EQUIPEMENT(
            REFEQUIPEMENT  Varchar (10) NOT NULL ,
            MODELEQUI      Varchar (50) ,
            MARQUEEQUI     Varchar (60) ,
            NUMEROSERIEQUI Varchar (50) ,
            IDCARAC        Smallint ,
            IDTYPEQUI      Smallint ,
            IDFOUR         Smallint ,
    		SUPPEQUIPEMENT INTEGER ,
            PRIMARY KEY (REFEQUIPEMENT ) ,
            UNIQUE (NUMEROSERIEQUI )
    )ENGINE=InnoDB;
    Raison pour lesquelles je crée les Triggers avec un table autre table pour sauvegarder les dernières valeurs et les afficher dans l'application.

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonel98.

    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    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 `incr`
    --------------
     
    --------------
    CREATE TABLE `incr` (
      `id`    integer unsigned  NOT NULL,
      `next`  integer unsigned      NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    drop table if exists `test`
    --------------
     
    --------------
    CREATE TABLE `test` (
      `id`    char(10) NOT NULL,
      `val`   char(10) NOT NULL,
      constraint pk_test_id  primary key (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `next`
    --------------
     
    --------------
    CREATE TRIGGER `next`
    BEFORE INSERT ON `test`
    FOR EACH ROW
    BEGIN
      declare _next integer unsigned default null;
     
      select next into _next from incr where id = 1 for update;
     
      set _next  = ifnull(_next+1,1);
      set new.id = concat('edt', right(concat('0000000', _next), 7));
     
      replace into `incr` (`id`,`next`) values (1, _next);
    END
    --------------
     
    --------------
    insert into `incr` (`id`,`next`) values (1, 0)
    --------------
     
    --------------
    insert into `test` (`val`) values ('un'),('deux'),('trois')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +------------+-------+
    | id         | val   |
    +------------+-------+
    | edt0000001 | un    |
    | edt0000002 | deux  |
    | edt0000003 | trois |
    +------------+-------+
    --------------
    select * from `incr`
    --------------
     
    +----+------+
    | id | next |
    +----+------+
    |  1 |    3 |
    +----+------+
    --------------
    rollback work
    --------------
     
    --------------
    insert into `test` (`val`) values ('quatre'),('cinq'),('six'),('sept')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +------------+--------+
    | id         | val    |
    +------------+--------+
    | edt0000001 | quatre |
    | edt0000002 | cinq   |
    | edt0000003 | six    |
    | edt0000004 | sept   |
    +------------+--------+
    --------------
    select * from `incr`
    --------------
     
    +----+------+
    | id | next |
    +----+------+
    |  1 |    4 |
    +----+------+
    --------------
    commit work
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    A chaque fois que tu fais un rollback, l'incrément revient à la valeur que tu avais lors du dernier commit.
    J'espère que c'est cela que tu désires.

    @+

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Merci Artemus24 j'ai pu résoudre le problème avec une partie de ton code que tu m'as donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE DEFINER=`root`@`localhost` trigger Trg_IDXEQUIPEMENT 
    after insert on equipement
     for each row 
     begin
      declare NUMCPTEQUI smallint default null ;
      select NEXTCPTEQUIPEMENT into NUMCPTEQUI from idxequipement where NUMCPTEQUIPEMENT = 1 for update;
       set NUMCPTEQUI  = ifnull(NUMCPTEQUI+1,1);
       replace into idxequipement (`NUMCPTEQUIPEMENT`,`NEXTCPTEQUIPEMENT`) values (1, NUMCPTEQUI);
    END
    la maintenant c'est à moi d'enregistrer la clé primaire de ma table Equipement en ajoutant des caractères que je voudrais je verifie seulement la la valeur
    de la propriété NEXTCPTEQUIPEMENT .
    Ton code va me servie lorsque je vais vouloir enregistrement une seul table . Merci

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonnel098.

    Pourquoi mettre ceci dans le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    after insert on equipement
    Est-ce que tu as déjà quelque chose dans ta colonne "id" servant de clef primaire ?

    Normalement, tu dois modifier la colonne "id" avant quelle soit enregistrée dans la table, sinon tu risques d'obtenir un problème de duplication sur la valeur NULL.

    Pour résoudre cela, il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    before insert on equipement
    et bien sûr, ne pas préciser le nom de la colonne "id" dans le insert. Pourquoi ?
    Car c'est le trigger qui va se charger de mettre la bonne valeur.

    Comment remplir la colonne "id" en tant que chaîne de caractères.
    Dans l'exemple, je prends la valeur de l'incrément dans la variable _next.
    Je concatène cette valeur en la complétant avec des zéros sur la gauche --> "0000000" + "15" (15 est la valeur de _next).
    Je prends que les sept caractères par la droite --> "0000015".
    Et je concatène par la gauche la chaîne "edt" --> "edt" + "0000015" ce qui donne "edt0000015".

    C'est ce que fait la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set new.id = concat('edt', right(concat('0000000', _next), 7));
    Je reste à ton service !

    @+

  12. #12
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    [QUOTE=Artemus24;8500061]Salut colonnel098.

    Pourquoi mettre ceci dans le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    after insert on equipement
    Est-ce que tu as déjà quelque chose dans ta colonne "id" servant de clef primaire ?
    J'ai crée la table sur une table qui va me permettre de sauvegarder la dernière valeur incrémenté concernant la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE idxequipement (
      NUMCPTEQUIPEMENT smallint(6) NOT NULL,
      NEXTCPTEQUIPEMENT smallint(6) NOT NULL, 
      PRIMARY KEY (NUMCPTEQUIPEMENT)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    puis maintenant dans mon application je vérifie si la propriété da la table idxequipement NEXTCPTEQUIPEMENT je récupère sa valeur je fais + 1 en ajoutant la chaîne de caractère desirer pour faire l'enregistrement de de notre clé primaire donc notre trigger doit se déclenché après l'enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TFrmEquipement.GetIDEquipement;
    var
      Numcpt: SmallInt;
    begin
      DataModuleAriel.QryIDXEqui.Close;  //Permet de Actualiser la table IDXEquipement
      DataModuleAriel.QryIDXEqui.Open(); // Permet de Actualiser la table IDXEquipement
      Numcpt := DataModuleAriel.QryIDXEquiNEXTCPTEQUIPEMENT.AsInteger; // Permet de récupéré la valeur de NEXTCPTEQUIPEMENT
        if Numcpt = 0 then // Vérifie si la valeur de NEXTCPTEQUIPEMENT = 0 
        cxTextEditRefEquipement.Text := 'infs1' // si NEXTCPTEQUIPEMENT = 0  alors Notre champs pour le ID = infs1
      else 
        cxTextEditRefEquipement.Text := 'infs' + // Sinon NEXTCPTEQUIPEMENT différent de 0 alors ID = infs + la valeur récupéré + 1  
          IntToStr(DataModuleAriel.QryIDXEquiNEXTCPTEQUIPEMENT.AsInteger + 1);
    end;

  13. #13
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonel098.

    Pour ta colonne "NUMCPTEQUI", laisse faire mysql. Il va la gérer comme si elle était auto_incrémenté.
    C'est le trigger qui va faire cela. Donc inutile de le faire dans ta procédure.

    Si tu veux préfixer les valeurs de ta colonne "NUMCPTEQUI" par la la chaîne "infs", sans formatage, il suffit d'ajouter ceci dans le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set new.id = concat('infs',  _next);
    Est-ce que tu utilises toujours ce préfixe "infs" pour ta colonne "NUMCPTEQUI" ?

    @+

  14. #14
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Est-ce que tu utilises toujours ce préfixe "infs" pour ta colonne "NUMCPTEQUI" ?
    Oui pour le préfixe infs c'est toujours utilisé .

    Citation Envoyé par Artemus24 Voir le message
    Pour ta colonne "NUMCPTEQUI", laisse faire mysql. Il va la gérer comme si elle était auto_incrémenté.
    C'est le trigger qui va faire cela. Donc inutile de le faire dans ta procédure.
    pour la colonne c'est NUMCPTEQUI c'est ma table qui me permet de récupéré la valeur du trigger pour l'affecter à un champs pour la Propriété Next

    Citation Envoyé par Artemus24 Voir le message
    Si tu veux préfixer les valeurs de ta colonne "NUMCPTEQUI" par la la chaîne "infs", sans formatage, il suffit d'ajouter ceci dans le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set new.id = concat('infs',  _next);
    Est-ce que tu utilises toujours ce préfixe "infs" pour ta colonne "NUMCPTEQUI" ?
    je veux savoir ici le new.id c'est quel id qui est renseigné ????
    et le problème mon trigger n'insert pas la valeur directement dans la table concerner mais plus tôt dans un table index que j'ai nommé IDX...... Cette valeur est récupéré ajouter par + 1 et affecté à un champs Edit.

  15. #15
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 881
    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 881
    Par défaut
    Salut colonnel098.

    Citation Envoyé par Colonnel098
    Oui pour le préfixe infs c'est toujours utilisé.
    Comme la réponse est oui, ta procédure ne sert à rien.

    Citation Envoyé par Colonnel098
    je veux savoir ici le new.id c'est quel id qui est renseigné ????
    Désolé, c'est une erreur de ma part. Tu dois lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set new.NUMCPTEQUI = concat('infs', _NUMCPTEQUI);
    Cette ligne signifie que tu vas écraser l'ancienne valeur de NUMCPTEQUI par le résultat de la fonction concat.
    Et tu dois obligatoirement préciser dans ton trigger : "before insert on equipement"

    Autrement dit, avant d'insérer ta ligne dans la table, tu vas remplacer le contenu de la colonne NUMCPTEQUI par le résultat de la fonction concat.

    Citation Envoyé par Colonnel098
    mon trigger n'insert pas la valeur directement dans la table concerner
    Voici comment tu dois écrire ton trigger. J'ai mis en rouge ce que tu dois ajouter.
    Le underscore (souligné) est important car cela permet de distinguer la variable du trigger, de celle de ta colonne dans ta table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE DEFINER=`root`@`localhost` trigger Trg_IDXEQUIPEMENT 
    before insert on equipement
    for each row 
    begin
      declare _NUMCPTEQUI smallint default null;
      select NEXTCPTEQUIPEMENT into _NUMCPTEQUI from idxequipement where NUMCPTEQUIPEMENT = 1 for update;
      set _NUMCPTEQUI  = ifnull(_NUMCPTEQUI+1,1);
      set new.NUMCPTEQUI = concat('infs', _NUMCPTEQUI);
      replace into idxequipement (`NUMCPTEQUIPEMENT`,`NEXTCPTEQUIPEMENT`) values (1, _NUMCPTEQUI);
    END
    Je pense que tu as toutes tes réponses ! Tu peux maintenant mettre ton sujet à résolu.

    @+

  16. #16
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Merci pour ton Aide .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de creation de trigger
    Par dhay06 dans le forum Développement
    Réponses: 6
    Dernier message: 26/05/2011, 09h05
  2. [PL/SQL] Creation de triggers dans transaction
    Par globeriding dans le forum Oracle
    Réponses: 15
    Dernier message: 07/02/2006, 11h33
  3. problème débutant avenc les triggers
    Par yayooyayoo2005 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 11/01/2006, 11h52
  4. Problème de creation de thread sous linux
    Par xilebo dans le forum POSIX
    Réponses: 4
    Dernier message: 27/10/2004, 09h58
  5. creation de trigger
    Par mitsubi dans le forum SQL
    Réponses: 3
    Dernier message: 12/09/2003, 15h13

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