Valores auto_increment personalizados

En el Perú los formatos numéricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo:

001-000034
001-000035
001-000036
...

Para manejar esto en MySQL he preparado una solución basada en otro articulo mio:

  1. Crear la tabla para guardar los números actuales:
    create table _sequence
    (
        seq_name varchar(50) not null primary key,
        seq_group varchar(10) not null,
        seq_val int unsigned not null
    );
  2. Crear una función para obtener el valor siguiente e incrementarlo:
    delimiter //
    drop function if exists getNextCustomSeq//
    create function getNextCustomSeq
    (
        sSeqName varchar(50),
        sSeqGroup varchar(10)
    ) returns varchar(20)
    begin
        declare nLast_val int; 
    
        set nLast_val =  (select seq_val
                              from _sequence
                              where seq_name = sSeqName
                                    and seq_group = sSeqGroup);
        if nLast_val is null then
            set nLast_val = 1;
            insert into _sequence (seq_name,seq_group,seq_val)
            values (sSeqName,sSeqGroup,nLast_Val);
        else
            set nLast_val = nLast_val + 1;
            update _sequence set seq_val = nLast_val
            where seq_name = sSeqName and seq_group = sSeqGroup;
        end if; 
    
        set @ret = (select concat(sSeqGroup,'-',lpad(nLast_val,6,'0')));
        return @ret;
    end// 
    
    delimiter ;
  3. Crear un procedimiento almacenado para modificar el valor actual:
    delimiter //
    drop procedure if exists sp_setSeqCustomVal//
    create procedure sp_setCustomVal(sSeqName varchar(50),  
                  sSeqGroup varchar(10), nVal int unsigned)
    begin
        if (select count(*) from _sequence  
                where seq_name = sSeqName  
                    and seq_group = sSeqGroup) = 0 then
            insert into _sequence (seq_name,seq_group,seq_val)
            values (sSeqName,sSeqGroup,nVal);
        else
            update _sequence set seq_val = nVal
            where seq_name = sSeqName and seq_group = sSeqGroup;
        end if;
    end//
    delimiter ;

Haciendo algunas pruebas:

  1. Crear una tabla:
    create table custom_autonums
    (
       id int not null primary key auto_increment,
       seq_1 varchar(20), -- custom sequence 1
       seq_2 varchar(20), -- custom sequence 2
       unique(seq_1),
       unique(seq_2)
    );
  2. Crear un trigger para la tabla:
    delimiter //
    drop trigger if exists custom_autonums_bi//
    
    create trigger custom_autonums_bi before insert on custom_autonums
    for each row
    begin
       set new.seq_1 = getNextCustomSeq("seq_1","001");
       set new.seq_2 = getNextCustomSeq("seq_2","DBA");
    end//
    
    delimiter ;
  3. Insertando algunos valores:
    insert into custom_autonums (id) values (null),(null),(null);
    select * from custom_autonums;
    +----+------------+------------+
    | id | seq_1      | seq_2      |
    +----+------------+------------+
    |  4 | 001-000001 | DBA-000001 |
    |  5 | 001-000002 | DBA-000002 |
    |  6 | 001-000003 | DBA-000003 |
    +----+------------+------------+
    3 rows in set (0.00 sec)
  4. Alterando los valores actuales:
    call sp_setCustomVal('seq_1','001',675);
    
    insert into custom_autonums (id) values (null),(null),(null);
    select * from custom_autonums;
    +----+------------+------------+
    | id | seq_1      | seq_2      |
    +----+------------+------------+
    |  4 | 001-000001 | DBA-000001 |
    |  5 | 001-000002 | DBA-000002 |
    |  6 | 001-000003 | DBA-000003 |
    |  7 | 001-000676 | DBA-000004 |
    |  8 | 001-000677 | DBA-000005 |
    |  9 | 001-000678 | DBA-000006 |
    +----+------------+------------+
    6 rows in set (0.00 sec)

Enjoy!

7 pensamientos en “Valores auto_increment personalizados

  1. como podria hacer para que el auto_increment enpieze desde un numero en espesifico? por ejemplo me gustaria que empiese a contar desde el numero 500.

    como puedo hacer eso?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.