[Resuelto] Crear Indice compuesto (AUTO_INCREMENT(DEL AÑO ACTUAL)+AÑO ACTUAL)

Iniciado por LaThortilla (Effort), 19 Febrero 2015, 23:21 PM

0 Miembros y 3 Visitantes están viendo este tema.

LaThortilla (Effort)

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 (sql) [Seleccionar]
BEGIN
DECLARE con INT;
SET con = (SELECT MAX(MID(tabla1.id,1,5))+1 FROM tabla1 WHERE YEAR(fecha) = YEAR(CURDATE()));
SET NEW.id = CONCAT(LPAD(con, 5,'0'), '/', YEAR(CURDATE()));
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.

MinusFour

Puedes hacerlo de varias formas, pero si quieres que lo maneje exclusivamente MySQL vas a necesitar usar trigger con INSERT.

LaThortilla (Effort)

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 (sql) [Seleccionar]


DELIMITER \\
CREATE TRIGGER MiTrigger AFTER INSERT ON MiTabla
FOR EACH ROW
BEGIN ...No se que hacer aqui supongo que ..

new.ID = Mi_index?
END \\
DELIMITER ;

MinusFour

Código (mysql) [Seleccionar]

CREATE TRIGGER concatId BEFORE INSERT ON tabla
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.

LaThortilla (Effort)

Tengo este trigger funcionando en la base

Código (sql) [Seleccionar]

CREATE TRIGGER concatId BEFORE INSERT ON tabla

FOR EACH ROW BEGIN

 SET NEW.IDYEAR =  CONCAT(LPAD(NEW.ID, 5, '0'),'/','2015');
END

donde ID es auto_increment y IDYEAR es varchar(15)
y como resultado al insertar tengo esto

Código (dos) [Seleccionar]
00000/2015

que hago mal?

MinusFour

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.

LaThortilla (Effort)

Cita de: 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.

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

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

MinusFour

Cita de: Effort en 20 Febrero 2015, 02:26 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 (mysql) [Seleccionar]

SELECT CONCAT(LPAD(tabla.id, 5 '0'), '/', tabla.año) AS idYear
FROM tabla

LaThortilla (Effort)

Cita de: MinusFour en 20 Febrero 2015, 02:34 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 (mysql) [Seleccionar]

SELECT CONCAT(LPAD(tabla.id, 5 '0'), '/', tabla.año) AS idYear
FROM tabla


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



Pero te agradezco mucho tu ayuda...

LaThortilla (Effort)

Solución:
Crear un Trigger Asi:


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


donde id es varchar(15);

Cualquier otra solución bienvenida seaa;