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

[SOLUCIONADO] Auto-Incrementar Campos en Mysql

Estas en el tema de Auto-Incrementar Campos en Mysql en el foro de Mysql en Foros del Web. Hola amigos, que tal? Estoy comenzando a trabajar con php y mysql, por lo que hasta ahora poseo conocimientos sumamente básicos de los mismos. El ...
  #1 (permalink)  
Antiguo 01/05/2014, 11:23
 
Fecha de Ingreso: mayo-2014
Ubicación: Venezuela
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Auto-Incrementar Campos en Mysql

Hola amigos, que tal?

Estoy comenzando a trabajar con php y mysql, por lo que hasta ahora poseo conocimientos sumamente básicos de los mismos. El problema que tengo en estos momentos es que necesito auto incrementar varios campos de un registro.

Al llenar todo el formulario, necesito que al presionar el boto submit, se me incrementen 3 campos: Libro, Folio y Boleta. Pero siguiendo algunas condiciones:

Boleta se incrementa de uno en uno, pero al llegar a 3 se incrementa Folio en 1, al Boleta llegar a 6, Folio se incrementa a 2. Es decir, cada tres registros Folio se irá incrementado.

Con respecto a Libro, este comienza en 1 y se incrementa cuando Boleta sea igual a 300, y al momento de Libro incrementarse a 2, Boleta y Folio deben reiniciarse.

Si pueden ayudarme de verdad estaré muy agradecido. Tengo varias semanas googleando y volviéndome loco y hasta ahora no consigo encontrarle la vuelta.

Muchas Gracias
  #2 (permalink)  
Antiguo 01/05/2014, 11:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Auto-Incrementar Campos en Mysql

Desde MySQL, no existe una forma directa de incrementar automáticamente más de un campo a la vez. Sólo puede haber un único AUTO_INCREMENT por tabla, y cuando lo hay debería ser parte de la PK.
Lo que quieres hacer se implementa realizando consultas para obtener los estados de cada campo, y crear los valores en consecuencia. No puede hacerse, como te digo, en forma automática.
En la base el único modo de lograr algo semejante es poniendo toda esa lógica en un stored procedure que haga todos los pasos y validaciones; de lo contrario deberás hacer eso mismo, pero en la aplicación y realizar todas esas queries una a una, antes de crear los valores a insertar definitivos.
__________________
¿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 01/05/2014, 14:37
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: Auto-Incrementar Campos en Mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
... y cuando lo hay debería ser parte de la PK.
Disculpa mi ignorancia... pero solo por conocimiento, ¿Qué es una PK?
  #4 (permalink)  
Antiguo 01/05/2014, 14:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Auto-Incrementar Campos en Mysql

Primay key, o clave primaria.
Supongo que sabes a qué me refiero, ¿no?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/05/2014, 10:48
 
Fecha de Ingreso: mayo-2014
Ubicación: Venezuela
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Auto-Incrementar Campos en Mysql

Intenté hacerlo a través de un procedimiento almacenado. Nunca había trabajado con algunos. Puedes decirme donde tengo el error? Asi tal cual no me funciona

DROP PROCEDURE IF EXISTS sp_autoincremento;
//
CREATE PROCEDURE sp_autoincremento()
BEGIN
if(exists(select libro,folio,boleta from biblioteca)) them
if(exists(select boleta from bautizo where mod(boleta,2)=0)) them
update bautizo set folio=folio+1;
if(exists(select boleta from bautizo where boleta=6)) them
update bautizo set boleta=1,folio=1,libro=libro+1;
else
update bautizo set boleta=boleta+1;
endif;
else
insert into bautizo(libro,folio,boleta) values(1,1,1);
endif;
END
//
  #6 (permalink)  
Antiguo 04/05/2014, 20:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Auto-Incrementar Campos en Mysql

Cita:
Iniciado por josueruiz91 Ver Mensaje
Intenté hacerlo a través de un procedimiento almacenado. Nunca había trabajado con algunos. Puedes decirme donde tengo el error? Asi tal cual no me funciona

DROP PROCEDURE IF EXISTS sp_autoincremento;
//
CREATE PROCEDURE sp_autoincremento()
BEGIN
if(exists(select libro,folio,boleta from biblioteca)) them
if(exists(select boleta from bautizo where mod(boleta,2)=0)) them
update bautizo set folio=folio+1;
if(exists(select boleta from bautizo where boleta=6)) them
update bautizo set boleta=1,folio=1,libro=libro+1;
else
update bautizo set boleta=boleta+1;
endif;
else
insert into bautizo(libro,folio,boleta) values(1,1,1);
endif;
END
//
Tienes más de un error, además de que estás planteando una solución sin analizarla previamente, lo que sólo te llevará a complicaciones.
1) No es THEM ("ellos"), sino THEN ("entonces").
2) No es ENDIF, sino END IF.
3) Tienes un IF sin cerrar al final.
4) No debes actualizar numeraciones, sino insertar registros nuevos. Esto me lleva a pensar que no está correctamente diseñado el modelo de datos.

Lo primero sería tratar de crear el algorimo que debería cumplirlo que quieres. Y eso se hace simplemente razonando lo que describes.
Debes:
1) Validar si existe el Libro (por consecuencia el prototipo del SP debería recibir al menos UN parámetro).
2) Si existe el libro: Validar cuál es el máximo de Boleta y del Folio para ese Libro.
2.3. Si Boleta < 3
2.3.1. Si Folio < 9 y es múltiplo de 3, sumar 1 a Boleta.
2.3.2. Sumar 1 a Folio.
3) Si no existe el Libro:
3.1. Dar de alta el Libro, la Boleta 1 y el Folio 1.

Un bosquejo de la idea, suponiendo que existen tres tablas (Libro, Biblioteca y Folio) sería mas o menos:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_autoincremento$$
  3.  
  4. CREATE PROCEDURE sp_autoincremento(IN vlibro INT)
  5. /*
  6. 1) Validar si existe el Libro (por consecuencia el prototipo del SP debería recibir al menos UN parámetro).
  7. 2) Si existe el libro: Validar cuál es el máximo de Boleta y del Folio para ese Libro.
  8. 2.3. Si Boleta < 3
  9. 2.3.1. Si Folio < 9 y es múltiplo de 3, sumar 1 a Boleta.
  10. 2.3.2. Sumar 1 a Folio.
  11. 3) Si no existe el Libro:
  12. 3.1. Dar de alta el Libro, la Boleta 1 y el Folio 1.
  13.  
  14. */
  15.     DECLARE v_libro INT;
  16.     DECLARE v_boleta INT;
  17.     DECLARE v_folio INT;
  18.  
  19.  
  20.     IF (SELECT COUNT(*) FROM biblioteca WHERE libro = vlibro) > 0 THEN
  21.     SELECT libro
  22.     FROM biblioteca
  23.     WHERE libro = vlibro
  24.  
  25.     INTO V_LIBRO;
  26.         SELECT MAX(boleta)
  27.         FROM bautizo
  28.         WHERE libro = v_libro
  29.         INTO V_BOLETA;
  30.  
  31.         SELECT MAX(folio)
  32.         FROM folios
  33.         WHERE libro = v_libro AND boleta = v_boleta
  34.         INTO V_FOLIO;
  35.         IF vBoleta < 3 THEN
  36.             IF ((v_folio DIV 3) * 3) = v_folio THEN
  37.                 SET v_boleta = v_boleta + 1;
  38.                 INSERT INTO bautizo(libro, boleta) VALUES (v_libro, v_boleta);
  39.             END IF;
  40.             SET v_folio = v_folio + 1;
  41.             INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, v_boleta, v_folio);
  42.         ELSE
  43.             IF ((v_folio DIV 3) * 3) = v_folio THEN
  44.                 SET v_libro = v_libro + 1;
  45.                 SET v_boleta = 1;
  46.                 SET v_folio = 1;
  47.             else
  48.                 SET v_libro = v_libro + 1;
  49.                 SET v_boleta = v_boleta + 1;
  50.                 SET v_folio = v_folio + 1;
  51.             END IF;
  52.             INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, v_boleta, v_folio);
  53.         END IF;
  54.    
  55.     ELSE
  56.         SELECT MAX(libro)
  57.         FROM biblioteca
  58.         WHERE libro = vlibro
  59.         INTO V_LIBRO;
  60.         IF v_libro IS NULL THEN
  61.             SET v_libro = 1;
  62.         ELSE
  63.             SET v_libro = v_libro + 1;
  64.         END IF;
  65.  
  66.         INSERT INTO bautizo(libro) VALUES(v_libro);
  67.         INSERT INTO biblioteca(libro, boleta) VALUES(v_libro, 1);
  68.         INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, 1, 1);
  69.     END IF;
  70. END$$
Esto es nada más que una aproximación, a la que hay que probar. La estoy bosquejando a vuelo de pájaro, por lo que peude tener errores.
__________________
¿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 06/05/2014, 10:13
 
Fecha de Ingreso: mayo-2014
Ubicación: Venezuela
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Auto-Incrementar Campos en Mysql

Muchas Gracias! Excelente!!!.... ya logré entender, Gracias por tomarte el tiempo

Etiquetas: campo, campos, php, registro, sql
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 03:36.