Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: LaThortilla (Effort) en 19 Febrero 2015, 23:21 pm



Título: [Resuelto] Crear Indice compuesto (AUTO_INCREMENT(DEL AÑO ACTUAL)+AÑO ACTUAL)
Publicado por: LaThortilla (Effort) en 19 Febrero 2015, 23:21 pm
Buenas tardes.



Tengo una tabla con id auto increment

--------------------------------
      ID          |fecha_creado
-------------------------------


como puedo hacer para que cada ves que haga un INSERT se concatene el año a el index.

ASI: 0000/2014

Solución:
Crear un Trigger Asi:

Código
  1. BEGIN
  2. DECLARE con INT;
  3. SET con = (SELECT MAX(MID(tabla1.id,1,5))+1 FROM tabla1 WHERE YEAR(fecha) = YEAR(CURDATE()));
  4. SET NEW.id = CONCAT(LPAD(con, 5,'0'), '/', YEAR(CURDATE()));
  5. END

donde id es varchar(15);


Dato que me pareció interesante:
    el AUTO_INCREMENT no es mas que un MAX(INDEX)...EJ: si se ingresa un id 50 aun que sea en el primer registro el AUTO_INDEX será 51.

probado y funcionando Gracias.. cualquier otra solución bienvenida sea....
Gracias.


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: MinusFour en 19 Febrero 2015, 23:59 pm
Puedes hacerlo de varias formas, pero si quieres que lo maneje exclusivamente MySQL vas a necesitar usar trigger con INSERT.


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: LaThortilla (Effort) en 20 Febrero 2015, 00:20 am
No manejo muy bien el tema de triggers y procedimientos en mysql pero buscare... tengo que leer un manual :/ ... ni modo..

Si me ayudas solo con esto te lo agradecería ...


Código
  1.  
  2. DELIMITER \\
  3. CREATE TRIGGER MiTrigger AFTER INSERT ON MiTabla
  4. FOR EACH ROW
  5. BEGIN ...No se que hacer aqui supongo que ..
  6.  
  7. NEW.ID = Mi_index?
  8. END \\
  9. DELIMITER ;


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: MinusFour en 20 Febrero 2015, 00:38 am
Código
  1. CREATE TRIGGER concatId BEFORE INSERT ON tabla
  2. FOR EACH ROW SET NEW.idFecha = CONCAT(NEW.id, '/', NEW.fecha);

Asumiendo que id no es auto_increment y que tienes un campo para fecha para el año y un campo idFecha para el resultado del string concatenado.


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: LaThortilla (Effort) en 20 Febrero 2015, 01:21 am
Tengo este trigger funcionando en la base

Código
  1. CREATE TRIGGER concatId BEFORE INSERT ON tabla
  2.  
  3. FOR EACH ROW BEGIN
  4.  
  5.  SET NEW.IDYEAR =  CONCAT(LPAD(NEW.ID, 5, '0'),'/','2015');
  6. END
donde ID es auto_increment y IDYEAR es varchar(15)
y como resultado al insertar tengo esto

Código
  1. 00000/2015

que hago mal?


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: MinusFour en 20 Febrero 2015, 01:25 am
El campo Id probablemente sea un campo con auto_increment. En la documentacion de MySQL lo explican, el campo aparece hasta despues de la insercion. Con AFTER INSERT tampoco puedes hacer el UPDATE a NEW.


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: LaThortilla (Effort) en 20 Febrero 2015, 02:26 am
El campo Id probablemente sea un campo con auto_increment. En la documentacion de MySQL lo explican, el campo aparece hasta despues de la insercion. Con AFTER INSERT tampoco puedes hacer el UPDATE a NEW.

En ese caso tendría que incrementarlo manual mente NO?

como podría hacer una consulta y guardarlo en una variable desde el trigger?


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: MinusFour en 20 Febrero 2015, 02:34 am
En ese caso tendría que incrementarlo manual mente NO?

como podría hacer una consulta y guardarlo en una variable desde el trigger?

No es tan sencillo. Como te dije, el campo se asigna despues de la insercion (AFTER) y no en antes (BEFORE) y no puedes actualizar el registro en ese entonces.

Porque no en lugar de repetir la informacion haces CONCAT en las consultas. Asi no repites informacion de la tabla:

Código
  1. SELECT CONCAT(LPAD(tabla.id, 5 '0'), '/', tabla.año) AS idYear
  2. FROM tabla


Título: Re: [AYUDA] indices compuestos MYSQL
Publicado por: LaThortilla (Effort) en 20 Febrero 2015, 02:50 am
No es tan sencillo. Como te dije, el campo se asigna despues de la insercion (AFTER) y no en antes (BEFORE) y no puedes actualizar el registro en ese entonces.

Porque no en lugar de repetir la informacion haces CONCAT en las consultas. Asi no repites informacion de la tabla:

Código
  1. SELECT CONCAT(LPAD(tabla.id, 5 '0'), '/', tabla.año) AS idYear
  2. FROM tabla

Necesito este formato por la razón que el index se reinicia cada año :/



Pero te agradezco mucho tu ayuda...


Título: Re: [Resuelto] Crear Indice compuesto (AUTO_INCREMENT(DEL AÑO ACTUAL)+AÑO ACTUAL)
Publicado por: LaThortilla (Effort) en 20 Febrero 2015, 18:28 pm
Solución:
Crear un Trigger Asi:


Código
  1. BEGIN
  2. DECLARE con INT;
  3. SET con = (SELECT MAX(MID(tabla1.id,1,5))+1 FROM tabla1 WHERE YEAR(fecha) = YEAR(CURDATE()));
  4. SET NEW.id = CONCAT(LPAD(con, 5,'0'), '/', YEAR(CURDATE()));
  5. END

donde id es varchar(15);

Cualquier otra solución bienvenida seaa;