Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

autoincrement en innoDB, NO UNICA

Estas en el tema de autoincrement en innoDB, NO UNICA en el foro de Mysql en Foros del Web. Hola Tengo un problemon y no consigo solucion :) Tengo una tabla con varios campos pero voy a comentar solo 2 q son los que ...
  #1 (permalink)  
Antiguo 10/05/2011, 13:05
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
autoincrement en innoDB, NO UNICA

Hola

Tengo un problemon y no consigo solucion :)

Tengo una tabla con varios campos pero voy a comentar solo 2 q son los que interesan

Campo: idfactura (INT)
Campo: linea (INT)

El caso es que quiero que el campo linea sea AUTOINCREMENTAL pero incremental en conjunto con idfactura, osea si meto idfactura=1 el dato de linea sera automaticamente 1, y si meto idfactura=1 OTRA VEZ el dato de linea sera automaticamente 2, pero QUIERO que si ahora añado idfactura=2 el autoincremental de linea empice desde 1 y no se vaya al 3 como es lo normal.

ESTO QUE COMENTO, se puede hacer facilmente cuando las tables son myISAM, pero con InnoDB no funciona, y necesito hacer lo mismo para una tabla innoDB.


¿¿Alguna idea para avanzar??

Muchas gracias.
  #2 (permalink)  
Antiguo 10/05/2011, 13:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
¿¿Alguna idea para avanzar??
Si es a través de los INSERT, te recomiendo un simple TRIGGER parecido a este:
Código MySQL:
Ver original
  1. DROP TRIGGER IF EXISTS set_subitemfactura;
  2. DELIMITER $$
  3. CREATE TRIGGER set_subitemfactura BEFORE INSERT
  4. ON factura
  5.         IF(SELECT MAX(subitem) FROM factura WHERE id_factura=NEW.id_fctura) IS NULL THEN
  6.       SET NEW.subitem = 1;
  7.     ELSE
  8.       SET NEW.subitem = (SELECT MAX(subitem) FROM factura WHERE id_factura = NEW.id_factura)+1;
  9.     END IF;
  10. END$$
  11.  
  12. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/05/2011, 13:27
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
Respuesta: autoincrement en innoDB, NO UNICA

gracias gnzsoloyo, haber si consigo visualizar la idea :) que no tengo costumbre en leer sentencias SQL fuera de lo normal jejeje.. intentare hacer algo en php y probarlo.


entiendo pues, que no tengo que hacer nada en las tablas, ni crear indices ni autoincrement ni nada, y todo va por el caminio de sentecias SQL al insertar datos.

venga, voy al lioo

Saludos.
  #4 (permalink)  
Antiguo 10/05/2011, 13:41
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
Respuesta: autoincrement en innoDB, NO UNICA

gnzsoloyo, no te lo vas a creer pero me has enseñado algo preciosooo y que no conocia de mysql :) TRIGGER jejeje, genial lo que puedo conseguir con esto.

claro, acostumbrado a crear bases de datos con phpmyadmin que no tiene o no veo forma de crear TRIGGER, pues normal el empanamiento.

muchas gracias por todo.
  #5 (permalink)  
Antiguo 10/05/2011, 14:16
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
Respuesta: autoincrement en innoDB, NO UNICA

bueno, ya lo tengo y funcionando de maravilla.

solo una pregunta acerca de los TRIGGER estos.
¿se autoeliminan si borro la tabla para la cual se asigno?

como estoy acostumbrado a hacer todo desde phpmyadmin y esta opcion ni la tiene ni la contempla, no puedo ver que sucede ni como borrar el TRIGGER creado en caso de no necesitarlo.

entonces era eso, ¿si borro la tabla se borra automaticamente esta TRIGGER?, en caso negativo, o en caso afirmativo tambien me serviria,
¿como me cargo la TRIGGER creada?
¿con un simple DROP TRIGGER set_subitemfactura o hay algo mas?
  #6 (permalink)  
Antiguo 10/05/2011, 17:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
solo una pregunta acerca de los TRIGGER estos.
¿se autoeliminan si borro la tabla para la cual se asigno?
La existencia de los TRIGGERs es como la de los índices: Como dependen de la tabla, se borran automáticamente si borras la tabla. No pueden existir sin ella.
Pero ten en cuenta una cosa: UN trigger se ejecuta siempre ante el mismo evento (INSERT, UPDATE o DELETE) en la misma tabla. No son condicionales.
Tampoco se puede escribir dos triggers para el mismo evento en la misma tabla, por lo que si tienes más de una tarea para ese mismo caso tienes que integrar todas las tareas en el mismo código.
Respecto a la carga, el script que te pasé tiene todo lo que se necesita para cargarlo por consola o por el MySQL Query Browser, e incluso el Workbench. Para hacerlo en phpMyAdmin tienes que eliminarle las líneas que tienen los DELIMITER y usar la ventana de SQL, donde abajo a la derecha o izquierda tienes un textbox que dice "Separador". Allí se pone ese "$$" que estoy poniendo como delimitador.
En esencia se cargan de la misma forma que un stored procedure.
ten en cuenta que la idea de un trigger es una tarea o conjunto de tareas que siempre se usará en esa base. SI son cosas transitorias no es una buena idea usarlos. Es mejor (y hay cómo) usar consultas más elaboradas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 10/05/2011, 17:49
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Para hacerlo en phpMyAdmin tienes que eliminarle las líneas que tienen los DELIMITER y usar la ventana de SQL, donde abajo a la derecha o izquierda tienes un textbox que dice "Separador". Allí se pone ese "$$" que estoy poniendo como delimitador.
si, lo hice ya en phpmyadmin de la forma que comentas, eso si lo controlaba :)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En esencia se cargan de la misma forma que un stored procedure.
ten en cuenta que la idea de un trigger es una tarea o conjunto de tareas que siempre se usará en esa base. SI son cosas transitorias no es una buena idea usarlos. Es mejor (y hay cómo) usar consultas más elaboradas.
esto ya me mosquea un poquito, aunq no acabo de entenderlo bien.
OSEA, que el trigger siempre va a estar en todas las consultas haga o no falta, ¿siempre que se use la DB o siempre que se use esa tabla? si es en la DB si es una putada, tampoco es plan de llenarlo de triggers y q esto afecte al rendimiento, si el trigger siempre se va a comparar cuando use la tabla donde se añadio tampoco es demasido problema.

lo de usar consultas mas elaboradas era otra opción, de echo para este caso ya la tenia lista, no era dificil, pero claro ya tenia que hacer un SELECT antes de cada INSERT, pero bueno que tampoco pasaba nada.

** edit
he visto en phpmyadmin que el trigger creado SI aparece reflajado, GENIAL.. ademas me permite editarlo o eliminarlo.

Última edición por suntus; 10/05/2011 a las 18:27
  #8 (permalink)  
Antiguo 10/05/2011, 18:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
¿siempre que se use la DB o siempre que se use esa tabla?
Están definidos sobre la tabla. Sólo operan cuando se produce el evento sobre el que trabajan.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 10/05/2011, 18:29
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 22 años
Puntos: 6
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Están definidos sobre la tabla. Sólo operan cuando se produce el evento sobre el que trabajan.
gracias gnz, eso ya tiene mejor color :)
  #10 (permalink)  
Antiguo 11/05/2011, 05:54
 
Fecha de Ingreso: abril-2011
Mensajes: 15
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: autoincrement en innoDB, NO UNICA

hola! Tengo la misma duda con las lineas de facturas.
No conocia lo de los trigger, y tengo una duda: Estoy realizando una aplicacion con java y mis sentencias sql para mysql van incrustadas con java. por ejemplo:

Código:
String sql = "UPDATE  tblUsuario SET password=? WHERE nick=?";		
...
preparedStatement = conexion.prepareStatement(sql);
...
preparedStatement.executeUpdate();
El trigger funcionaria si lo incluyo en esta sql dentro de las clases java del DAO???
  #11 (permalink)  
Antiguo 11/05/2011, 06:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: autoincrement en innoDB, NO UNICA

Cita:
Iniciado por anyian Ver Mensaje
hola! Tengo la misma duda con las lineas de facturas.
No conocia lo de los trigger, y tengo una duda: Estoy realizando una aplicacion con java y mis sentencias sql para mysql van incrustadas con java. por ejemplo:

Código:
String sql = "UPDATE  tblUsuario SET password=? WHERE nick=?";        
...
preparedStatement = conexion.prepareStatement(sql);
...
preparedStatement.executeUpdate();
El trigger funcionaria si lo incluyo en esta sql dentro de las clases java del DAO???
¿Entiendes bien de qué estamos hablando cuando tratamos sobre TRIGGER?
Es una rutina que se crea y pertenece a una tabla de una base de datos dada, para realizar una o más operaciones en forma atómica cuando se produce un evento DML sobre una la tabla a la que pertenece.
No se invoca, no se accede, no se parametriza (los únicos parámetros son valores de la tabla). Simplemente se ejecuta sola, lo quieras o no, ante el mismo evento de la misma tabla, siempre.
Como es un objeto permanente de la base, se crean y siguen existiendo hasta que se los elimina o modifica. Esto significa que se crean al mismo tiempo que todo el resto de la base, o se los agrega.

Por otro lado, no es buena costumbre "colgarse" de un post ajeno para preguntar otras cosas por más que sea el mismo tema. En tu caso la pregunta puede requerir más explicaciones y sería buena idea que abrieras un post propio, así no nos desviamos del tema original en este thread, que no eran los triggers.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: innodb, unica, autoincrementable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:19.