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

crear campo con prefijo increment

Estas en el tema de crear campo con prefijo increment en el foro de Mysql en Foros del Web. hola a todos, estoy creando un proyecto web con php y mysql, me serviria saber de que manera podria hacer que un campo de la ...
  #1 (permalink)  
Antiguo 04/02/2016, 20:37
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
crear campo con prefijo increment

hola a todos, estoy creando un proyecto web con php y mysql, me serviria saber de que manera podria hacer que un campo de la tabla tenga un prefijo que se incremente en automatico en cada insert...

es decir...

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS agenda_cliente(
  2.     id int(5) NOT NULL AUTO_INCREMENT,
  3.     codigo varchar(10) NOT NULL AUTO_INCREMENT,
  4.     nombre varchar(50) NOT NULL,
  5.     apellidos varchar(50) NOT NULL,
  6.     telefono int(15) NULL,
  7.     PRIMARY KEY(id),
  8.     ) engine=InnoDB;
[/CODE]

y como resultado:

Código:
1, CODIGO0001, Mario, Rojas, 3432345432
2, CODIGO0002, Roberto, Flores, 343234562
3, CODIGO0003, Dario, Gonzales, 3499945432
4, CODIGO0004, David, Garcia, 3765445432
5, CODIGO0005, Mauro, Toledo, 3111345432
como podria lograr que q el campo codigo tenga un prefijo CODIGO??,,, nose si con mysql se puede hacer en automatico.... de otra manera podria usar la opcion de concatenar en php CODIGO antes del insert.. aunq haceindo eso deberia saber cual es el ultimo valor de codigo en la tabla...

espero puedan aconsejarme, gracias anticipadamente.

Saludos.

Última edición por gnzsoloyo; 05/02/2016 a las 07:31
  #2 (permalink)  
Antiguo 04/02/2016, 21:45
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
Respuesta: crear campo con prefijo increment

Que yo sepa, autoincrement o autoincrementar es para números y no caracteres ya que lleva un conteo.

Por lo tanto MySQL ni ningún motor de BD creo que pude hacer eso. En tu caso, lo que podrías hacer es utilizar un campo autoincrement normalmente y otro campo tipo varchar donde guardes la concatenación de CODIGO, el relleno de ceros y el número que tenga el autoincrement cuando se agrega un registro nuevo.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #3 (permalink)  
Antiguo 05/02/2016, 06:58
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 5 meses
Puntos: 15
Respuesta: crear campo con prefijo increment

Es más fácil hacer lo que dices usando un SP...



Lo que tendrías que hacer es cortar tu varchar en 'CODIGO - 0001', convertir el segundo varchar en int, aumentarle uno, pasarlo a varchar agregándole los 0 que faltan para que sea largo 5 y luego juntar ambos varchar xD
(En sql server se podría no se en MYSQL)


Pero la opción de BrujoNic es mucho más viable
  #4 (permalink)  
Antiguo 05/02/2016, 07:46
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: crear campo con prefijo increment

Vamos a ver si se entiende la idea que te exponemos:

Creamos la tabla de ejemplo.
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS agenda_cliente;
  2. Query OK, 0 rows affected (0.05 sec)
  3.  
  4. mysql> CREATE TABLE IF NOT EXISTS agenda_cliente(
  5.     ->     id_cliente INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  6.     ->     codigo VARCHAR(10) NOT NULL,
  7.     ->     nombre VARCHAR(50) NOT NULL,
  8.     ->     apellidos VARCHAR(50) NOT NULL,
  9.     ->     telefono VARCHAR(15) NULL
  10.     ->     ) ENGINE=INNODB;
  11. Query OK, 0 rows affected (0.16 sec)
Notarás que he cambiado el nombre del campo ID por algo mas identificador, la "longitud" qu e pusiste en el INT y que no sirve para nada, por el valor por default, pero UNSIGNED, y lo declaro AI y PK.
Tambien que cambié el tipo de dato de telefono por VARCHAR. Esto es por algo que tal vez tu no sepas, pero el tipo de dato usado para los telefonos es siempre varchar. Trabajo en interfases de datos de una empresa de telefonia celular, te lo digo con conocimiento de causa. Hay razones técnicas para hacerlo asi.

Luego insertamos datos imaginarios:
Código MySQL:
Ver original
  1. mysql> INSERT INTO agenda_cliente (codigo, nombre, apellidos, telefono)
  2.     -> VALUES ('DBA', 'Luis', 'Sanchez', '1154545454'),
  3.     ->  ('DBA', 'Luis', 'Sanchez', '1221122121'),
  4.     ->  ('AST', 'Alicia', 'Fahon', '3232323232'),
  5.     ->  ('AST', 'Roxana', 'Kramer', '5454545454'),
  6.     ->  ('DBA', 'Federico', 'Filis', '9823571698'),
  7.     ->  ('FRA', 'Nestor', 'Domec', '6598953265');
  8. Query OK, 6 rows affected (0.01 sec)
  9. Records: 6  Duplicates: 0  Warnings: 0

Y finalmente probamos:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     CONCAT(codigo, LPAD(id_cliente, 8, '0')) codigo,
  3.     ->     apellidos,
  4.     ->     telefono
  5.     -> FROM
  6.     ->     agenda_cliente;
  7. +-------------+-----------+------------+
  8. | codigo      | apellidos | telefono   |
  9. +-------------+-----------+------------+
  10. | DBA00000001 | Sanchez   | 1154545454 |
  11. | DBA00000002 | Sanchez   | 1221122121 |
  12. | AST00000003 | Fahon     | 3232323232 |
  13. | AST00000004 | Kramer    | 5454545454 |
  14. | DBA00000005 | Filis     | 9823571698 |
  15. | FRA00000006 | Domec     | 6598953265 |
  16. +-------------+-----------+------------+
  17. 6 rows in set (0.00 sec)
LPAD() rellena a izquierda el caracter que le digas. RPAD hace exactamente lo contrario.
__________________
¿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 05/02/2016, 08:59
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 5 meses
Puntos: 15
Respuesta: crear campo con prefijo increment

Ojo que esta opción solo resulta si tu código, en especial el número, está asociado al id AI. Si el ID esta asociado a otro proceso o a otro dato no se podría realizar la solución.



Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos a ver si se entiende la idea que te exponemos:

Creamos la tabla de ejemplo.
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS agenda_cliente;
  2. Query OK, 0 rows affected (0.05 sec)
  3.  
  4. mysql> CREATE TABLE IF NOT EXISTS agenda_cliente(
  5.     ->     id_cliente INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  6.     ->     codigo VARCHAR(10) NOT NULL,
  7.     ->     nombre VARCHAR(50) NOT NULL,
  8.     ->     apellidos VARCHAR(50) NOT NULL,
  9.     ->     telefono VARCHAR(15) NULL
  10.     ->     ) ENGINE=INNODB;
  11. Query OK, 0 rows affected (0.16 sec)
Notarás que he cambiado el nombre del campo ID por algo mas identificador, la "longitud" qu e pusiste en el INT y que no sirve para nada, por el valor por default, pero UNSIGNED, y lo declaro AI y PK.
Tambien que cambié el tipo de dato de telefono por VARCHAR. Esto es por algo que tal vez tu no sepas, pero el tipo de dato usado para los telefonos es siempre varchar. Trabajo en interfases de datos de una empresa de telefonia celular, te lo digo con conocimiento de causa. Hay razones técnicas para hacerlo asi.

Luego insertamos datos imaginarios:
Código MySQL:
Ver original
  1. mysql> INSERT INTO agenda_cliente (codigo, nombre, apellidos, telefono)
  2.     -> VALUES ('DBA', 'Luis', 'Sanchez', '1154545454'),
  3.     ->  ('DBA', 'Luis', 'Sanchez', '1221122121'),
  4.     ->  ('AST', 'Alicia', 'Fahon', '3232323232'),
  5.     ->  ('AST', 'Roxana', 'Kramer', '5454545454'),
  6.     ->  ('DBA', 'Federico', 'Filis', '9823571698'),
  7.     ->  ('FRA', 'Nestor', 'Domec', '6598953265');
  8. Query OK, 6 rows affected (0.01 sec)
  9. Records: 6  Duplicates: 0  Warnings: 0

Y finalmente probamos:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     CONCAT(codigo, LPAD(id_cliente, 8, '0')) codigo,
  3.     ->     apellidos,
  4.     ->     telefono
  5.     -> FROM
  6.     ->     agenda_cliente;
  7. +-------------+-----------+------------+
  8. | codigo      | apellidos | telefono   |
  9. +-------------+-----------+------------+
  10. | DBA00000001 | Sanchez   | 1154545454 |
  11. | DBA00000002 | Sanchez   | 1221122121 |
  12. | AST00000003 | Fahon     | 3232323232 |
  13. | AST00000004 | Kramer    | 5454545454 |
  14. | DBA00000005 | Filis     | 9823571698 |
  15. | FRA00000006 | Domec     | 6598953265 |
  16. +-------------+-----------+------------+
  17. 6 rows in set (0.00 sec)
LPAD() rellena a izquierda el caracter que le digas. RPAD hace exactamente lo contrario.
  #6 (permalink)  
Antiguo 05/02/2016, 09:11
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
La solución es independiente de si es auto_increement o no.
Sólo requiere que el campo cliente_id sea numérico. De dónde salga el numero es irrelevante para la query, es algo que debe definirse en el sistema, y eso dependerá de los requerimientos de usuario.
Estoy usando un AI, porque italo_pm lo definió así en la tabla del primer post.
En el caso que se deba reiniciar el numero por cada codigo diferente, es simplemente un valor paramétrico que se deberá controlar en una tabla de codigos... No representa diferencia para la query, sino para el INSERT.
__________________
¿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 17/02/2016, 23:06
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

gracias a todos por sus consejos y respuesta, pero solo ahora me doy cuenta que el ejemplo que escribi no resuelve mi problema, practicamente estoy dasarrollando una web (a nivel de practica) para un centro de datos, donde la necesidad es el reporting de los procesos batch que ese ejecutan durante el dia/noche y van en error o deadlock, asi como las actividades programadas de la oficina (checklist) y otras cosas (llamadas a los encargados de los procesos de los sistemas open o host...etc, etc, etc...)

cada una de estas actividades tiene una tabla en el database, pero lo que deseo hacer es que cada una de las actividades que inserto este reconocida con un numero de ticket o numero de report (algo asi cuando compras online y te dan un numero de orden...) al hacer el insert de cada actividad que me genere un numero de ticket,.... pero para esto imagino que tendria q hacer un doble insert, primero uno de la actividad normal y luego otro para generar el numero de ticket y para eso en la nueva table tendria que poner los id's de todas otras tablas pero de esa manera tendria campos en null porq en cada insert solo deberia insert el id de una tabla a la vez ... correcto??

estoy usando php y mysql...

primera pregunta.. escribo aqui en la seccion base de datos o php??

algun consejo o sugerencia?

gracias de antemano. saludos.

Última edición por italo_pm; 17/02/2016 a las 23:25
  #8 (permalink)  
Antiguo 18/02/2016, 06: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: 17 años
Puntos: 2658
Respuesta: crear campo con prefijo increment

Te estás ahogando en un vaso de agua a mi entender, tal vez porque estás pensando en procesos, en lugar de pensar en datos.
Vamos a ver si entiendo.
Tienes N actividades que corresponden a los registros de N tablas, y necesitas crear una única entidad donde se almacenen los reportes de las acciones registradas en esas tablas, durante un X periodo de tiempo.
¿Algo así?

Bueno, si cada acción debe generar un ticket, y todos los tickets deben almacenarse en una única tabla, es perfectamente posible si:
1) Cada tabla origen de una acción es identificada por un código.
2) Cada acción en su propia tabla tiene un ID numérico o alfanumérico
3) Al ejecutarse el proceso indicado en su tabla el resultado se almacene en la tabla de tickets con CodigoProceso+ID tabla origen.
Ese par de datos compondría la PK de la tabla de tickets..

Esa es una solución que posee como problema que no podrías mantener la consistencia de datos entre los tickets y las otras tablas por FK, ya que una FK no puede apuntar a múltiples tablas. Te obligaría a mantener la consistencia programáticamente, con los riesgos que ellos implica.

Una segunda solución es aún mas sencilla, y consiste en plantear la solución entera de otro modo:
1) Una tabla de tickets con su PK basada en dos campos: un código de proceso, como antes, y un campo numérico que puede ser AI o no. La tabla ademas contendrá fecha de inserción, de inicio de proceso, de finalización de proceso, y estado de resultado.
2) La inserción de todos los procesos a realizar, sin importar cual sea, se reportan en esta tabla, insertándolos.
3) Las tablas de procesos heredan la PK de esta tabla (tablas hijas), y almacenan los restantes datos propios de ese proceso.
4) AL ejecutarse el proceso correspondiente, si termina bien o mal, se actualiza la tabla padre con fecha de terminación y estado. Los datos necesarios para ese update estan en la propia PK de la tabla ija.

La ventaja de este modelo es que puedes aumentar la cantidad de tipos diferentes de proceso sin necesidad de otro cambio que crear una tabla hija adicional por cada uno. El resto de la logica permanece constante.

¿Se entiende la idea?
__________________
¿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 18/02/2016, 22:44
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

hola, muchas gracias por la respuesta, escribo mejor mi problema y dudas,

practicamente lo que estoy desarrollando es un dashboard donde manejo distintas actividades de distintas areas de una oficina (secciones)...el dashboard tramite un menu dirige al usuario a las distintas secciones de la web, donde se puede ingresar datos por medio de los forms al database...

mi problema es q como cada seccion es distinta entre si xq no tienen una conexión logica entre ellos (porque la web/dashboard trata desde checklist de la oficina, actividades, procesos batch ejecutados o en error, llamadas a los encargados de las aplicaciones, estadisticas, avisos de comunicados) cada uno de ellos tiene sus formularios para el insert al database en sus respectivas tablas, los id's suelen repetirse y esto me genera un problema al momento de generar el numero de "ticket" que debo entregar al usuario (al momento casi manualmente), por el momento debo concatenar el id con un codigo php distinto que identifique a las tablas... por ejemplo si se trata de "actividades" una vez que tengo el id del campo lo cancadeno en php con la palabra "ACTI+el id" y lo mismo con las otras tablas... ERRHOST si se trata de un error en los batch host o ERROPEN si fuera del open... pero creo q eso no es lo correcto y deseaba saber si puedo hacer una especie de TICKET o numero de orden en automatico tan solo con los id's de las distintas tablas, me bloqueo en el razonamiento de que si tengo 6 secciones en la web son 6 tablas de datos efectivos y por lo tanto serian 6 id's en foreign key en una tabla mas su propio id es decir .....

Código PHP:
CREATE TABLE IF NOT EXISTS tb_ticket (
    
id_ticket int(8NOT NULL AUTO_INCREMENT,
    
id_tabla1 int(8) ,
    
id_tabla2 int(8) ,
    
id_tabla3 int(8) ,
    
id_tabla4 int(8) ,
    
id_tabla5 int(8) ,
    
id_tabla6 int(8) ,    
    
PRIMARY KEY(id_ticket),
    
FOREIGN KEY (id_tabla1REFERENCES tabla1(id_tabla1)
    
FOREIGN KEY (id_tabla2REFERENCES tabla2(id_tabla2)
    
FOREIGN KEY (id_tabla3REFERENCES tabla3(id_tabla3)
    
FOREIGN KEY (id_tabla4REFERENCES tabla4(id_tabla4)
    
FOREIGN KEY (id_tabla5REFERENCES tabla5(id_tabla5)
    
FOREIGN KEY (id_tabla6REFERENCES tabla6(id_tabla6)
    ) 
engine=InnoDB
pero si es que hiciera algo asi no estaria dejando 5 campos en NULL?? aunq si mal no recuerdo con FOREIGN KEY los campos por default son NOT NULL creo.... ya que guardaria solo la informacion del id_ticket mas uno de los otros id's...

al menos de esa manera podria usar el id_ticket como codigo unico de todas las secciones.... siempre haciendo la concatenacion en php con una "TICKET+id_ticket" ....

es lo correcto ?? por alguna razon me he bloquiado y no logro salir de esta problema... si podrian aconsejarme/ayudarme por favor.

gracias anticipadas.

Italo.
  #10 (permalink)  
Antiguo 20/02/2016, 15:00
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

hola, estaba tratando de interpretar tu respuesta,

como les decia que las tablas no tienen ninguna logica entri si conceptualmente, lo que necesito es generar un unico ticket cada vez que se inserte un record en alguna de las tablas...

he creado esto como ejemplo:

Código MySQL:
Ver original
  1. CREATE TABLE `tb_abend` (
  2.   `id_abend` int(11) NOT NULL AUTO_INCREMENT,
  3.   `nombre_abend` varchar(50) NOT NULL,
  4.   `descri_abend` varchar(50) NOT NULL,
  5.   PRIMARY KEY (`id_abend`)
  6.  
  7. CREATE TABLE `tb_error` (
  8.   `id_error` int(11) NOT NULL AUTO_INCREMENT,
  9.   `nombre_error` varchar(50) NOT NULL,
  10.   `descri_error` varchar(50) NOT NULL,
  11.   PRIMARY KEY (`id_error`)
  12.  
  13. CREATE TABLE `tb_actividades` (
  14.   `id_actividades` int(11) NOT NULL AUTO_INCREMENT,
  15.   `nombre_actividades` varchar(50) NOT NULL,
  16.   `descri_actividades` varchar(50) NOT NULL,
  17.   PRIMARY KEY (`id_actividades`)
  18.  
  19. CREATE TABLE `tb_ticket` (
  20.   `id_ticket` int(11) NOT NULL AUTO_INCREMENT,
  21.   `nombre_tab` varchar(30) NOT NULL,
  22.   `id_record` int(11) NOT NULL,
  23.   PRIMARY KEY (`id_ticket`)

donde:

id_ticket: es PK, y sera el numero unico en el sistema(el cual entregare a los usuarios... y luego la concateno con algo asi TICKET+PK para q sea mas amigable)

nombre_tab: es el nombre de la tabla de donde viene insertado el record (tb_abend o tb_contesa o tb_attivita)

id_record: es el valor del id de la tabla tratada. (id_abend o id_error o tb_actividad)

id_record es un valor que se puede repetir por eso fue que se agrego el campo nombre_tab que seria el nombre de la tabla (tb_abend o tb_contesa o tb_attivita)

practicamente con php:

- ejecuto el insert en una de las tablas (tb_abend o tb_error o tb_actividad). para cada seccion conosco el nombre de la tabla y la memorizo en una variable...

- luego ahi mimos intercepto el ultimo id (id_abend o id_error o tb_actividad) de la tabla tratada y la memorizo en una variable..

- ejecuto el insert en tb_ticket donde doy en input el nombre de la tabla (nombre_tab ya memorizado en una variable.) y el ultimo id de esa mimsa (id_record ya memorizado en una variable.)

el problema es que no logro conectarlas con las foreign key o si convendria tener una doble primary key...

algun consejo o sugerencia???

gracias

Salu2
  #11 (permalink)  
Antiguo 21/02/2016, 15:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: crear campo con prefijo increment

Te estas complicando demasiado, con 3 tablas podrias sacar lo que necesitas una de actividades:

actividad
id, nombre, descripcion, id_tipo


y otra de tipos de actividad:

tipos
id_tipo descripcion

ahora para los tickets generarias una tabla como esta:

tickets
id_ticket, id_actividad

y listo con un ejemplo como este podrias tener la actividad 1 de tipo error, genero el ticket 1, la actividad 2 de tipo asistencia genero el ticket 2, se entiende??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 21/02/2016, 21:45
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

hola, muchas gracias por tu respuesta, si entiendo tu ejemplo , pero creo q me falto ser mas detallado... si bien lo q me sugieres funciona solo cuando las tablas (actividad) tienen los mismos campos , pero en mi caso (me olvide de escribirlo), las tablas no tienen los mismos datos...

por ejemplo:
Código:
actividades:
id_actividade,descripcion,notas,periodo,prioridad,fecha,firma

batch_error
id_batch_error,nombre_batch,application,codigo_error,stepname,procstep,prioridad,fecha,hora,firma

oficina (esta tabla es solo un ejemplo)
id_oficina ,nombre_empleado,nombre_turnista,nombre_jefe_oficina
como se puede ver, son tablas que no tienen una relacion entre ellas, pero necesito generar un numero de ticket al momento de hacer un insert en cada una de ellas, ese numero de ticker se lo entregare al usuario para q sepa su numero etc etc etc etc...

siguiendo el ejemplo que compartiste:


Cita:
actividad
id, nombre, descripcion, id_tipo

y otra de tipos de actividad:

tipos
id_tipo descripcion

ahora para los tickets generarias una tabla como esta:

tickets
id_ticket, id_actividad
pues funciona solo si las tablas hubieran tenido nombre, descripcion, siempre (repito fue un error mio hacer un ejemplo como el post anterior)... pero ese no es mi caso, cada tabla tiene un contenido distinto...por eso pensaba hacer algo

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS tb_ticket (
  2.     id_ticket INT(8) NOT NULL AUTO_INCREMENT,
  3.     id_tabla1 INT(8) ,
  4.     id_tabla2 INT(8) ,
  5.     id_tabla3 INT(8) ,
  6.     id_tabla4 INT(8) ,
  7.     id_tabla5 INT(8) ,
  8.     id_tabla6 INT(8) ,    
  9.     PRIMARY KEY(id_ticket),
  10.     FOREIGN KEY (id_tabla1) REFERENCES tabla1(id_tabla1)
  11.     FOREIGN KEY (id_tabla2) REFERENCES tabla2(id_tabla2)
  12.     FOREIGN KEY (id_tabla3) REFERENCES tabla3(id_tabla3)
  13.     FOREIGN KEY (id_tabla4) REFERENCES tabla4(id_tabla4)
  14.     FOREIGN KEY (id_tabla5) REFERENCES tabla5(id_tabla5)
  15.     FOREIGN KEY (id_tabla6) REFERENCES tabla6(id_tabla6)
  16.     ) engine=InnoDB;

pero de esa manera tendre 5 campos vacios en cada insert e imagino q eso es un error...

y por eso pensaba en hacer algo tipo:

Código SQL:
Ver original
  1. CREATE TABLE `tb_tickets` (
  2.   `id_ticket` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `id_nombre_tabla` INT(11) NOT NULL,
  4.   `id_record` INT(11) NOT NULL,
  5.   PRIMARY KEY (`id_ticket`)
  6. ) ENGINE=InnoDB;

donde:

id_record seria el record osea el id_ de la tabla donde hago el insert...

id_nombre_tabla adaptando a tu ejemplo podria ser el id_tipo que especifica el nombre de la tabla pero vuelvo a lo mismo de como crear un foreing key de un campo rferenciado a distintos campas de distintas tablas.???

nose si es factible hacerlo , porque supuestamente el id_nombre_tabla soporta solo un foreing key y no mas de uno....

alguna sugerencia??

gracias por su ayuda...

saludos.

Última edición por italo_pm; 21/02/2016 a las 22:59
  #13 (permalink)  
Antiguo 22/02/2016, 15:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: crear campo con prefijo increment

De nuevo te complicas demasiado, podrias sacar la informacion de la forma que te lo mencione(claro usando tus 3 tablas pues las 3 tienen campos diferentes, pero agregando a cada tabla el id_tipo ;) )

actividades:
id_actividade,descripcion,notas,periodo,prioridad, fecha,firma, id_tipo

batch_error
id_batch_error,nombre_batch,application,codigo_err or,stepname,procstep,prioridad,fecha,hora,firma,id _tipo

oficina (esta tabla es solo un ejemplo)
id_oficina ,nombre_empleado,nombre_turnista,nombre_jefe_ofici na,id_tipo

tipos
id_tipo descripcion

ahora para los tickets generarias una tabla como esta:

tickets
id_ticket, id_actividad, id_tipo

y no necesitas generar tantas llaves foraneas :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 23/02/2016, 03:18
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

Hola Libras, nuevamente gracias por la ayuda, pues ahora si que te entendi, es justo lo que necesibata, al final hice esto (gracias a tu ayuda)..

Cita:
actividades:
id_actividad,descripcion,notas,periodo,prioridad, fecha,firma, id_tipo

batch_error:
id_batch_error,nombre_batch,application,codigo_err or,stepname,procstep,prioridad,fecha,hora,firma, id _tipo

oficina:
id_oficina ,nombre_empleado,nombre_turnista,nombre_jefe_ofici na, id_tipo

tipos:
id_tipo, descripcion

tickets
id_ticket, id_record, id_tipo
y aqui surgen mis dudas...

- sea la tabla actividades,batch_error y oficina el id_tipo son foreign key de id_tipo en la tabla tipos, correcto??

- en la tabla tickets en lugar de id_actividad la cambie por id_record que seria el numero de los id_actividad o id_batch_error o id_oficina , correcto?

y id_tipo en la tabla tickets seria el valor de id_tipo d cada tabla...correcto??

pero id_record en tickets no es foreign key de ninguna tabla, solo id_tipo en tickets es foreign key de id_tipo en la tabla tipos, la select funciona manteniendo estas reglas, pero desearia saber si esta bien o no??

por otra parte en un hipotetico caso un usuario me pidiera informacion del ticket numero 55 es decir id_ticket en la tabla ticket 55,

tickets
id_ticket = 55
id_record = 15
id_tipo = 5

donde record = hola mundo
tipo = actividades

como haria la select ??

Código MySQL:
Ver original
  1. SELECT  `tba`.*
  2.   `tb_actividades` `tba`,
  3.   `tb_tickets_test` `tbtk`,
  4.   `tb_tipos` `tbt`
  5.   `tbtk`.`id_record` = `tba`.`id_actividad` AND
  6.   `tbtk`.`id_tipo` = `tbt`.`id_tipo` AND
  7.    `tbtk`.`id_ticket` = 55;

esto funciona y me da como output:

record 15 = hola mundo
tipo 5 = actividades

pero lo se yo porque conosco las tablas, pero una vez que lo ponga dinamicamente ... o en el mismo editor de mysql como haria la select si solo me dan un numero de ticket y nada mas??

tendria que hacer una subquery?? con 2 select??

alguna sugerencia?!

gracias por la paciencia y disponibilidad.

salu2
  #15 (permalink)  
Antiguo 23/02/2016, 09:28
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: crear campo con prefijo increment

- sea la tabla actividades,batch_error y oficina el id_tipo son foreign key de id_tipo en la tabla tipos, correcto??
Asi es id_tipo seria una FK

- en la tabla tickets en lugar de id_actividad la cambie por id_record que seria el numero de los id_actividad o id_batch_error o id_oficina , correcto?
Asi es :)
y id_tipo en la tabla tickets seria el valor de id_tipo d cada tabla...correcto??
Es correcto

pero id_record en tickets no es foreign key de ninguna tabla, solo id_tipo en tickets es foreign key de id_tipo en la tabla tipos, la select funciona manteniendo estas reglas, pero desearia saber si esta bien o no??
Ahi es donde hay una falla en mi planteamiento, exactamente no hay habria FK de las tablas, ya que esta informacion vendria de 3 tablas diferentes(a nivel normalizacion no se si eso este bien....)


ahora en tu ultima pregunta, no entiendo esa parte de cuando lo pongas dinamico, a que te refieres? y si con el puro numero de ticket podrias saber que tipo de actividad es :) y los join explicitos?? que paso con eso??

Código SQL:
Ver original
  1. SELECT * FROM tickets t1
  2. LEFT JOIN actividades t2 ON (t1.id_record=t2.id_actividad AND t1.id_tipo=t2.id_tipo)
  3. LEFT JOIN batch_error AS t3 ON (t1.id_record=t3.id_batch AND t1.id_tipo=t3.id_tipo)
  4. LEFT JOIN oficina AS t4 ON (t1.id_record=t4.id_oficina AND t1.id_tipo=t4.id_tipo)
  5. INNER JOIN tipos AS t5 ON (t1.id_tipo=t5.id_tipo)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 23/02/2016 a las 09:39
  #16 (permalink)  
Antiguo 23/02/2016, 23:42
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

hola, nuevamente gracias por la respuesta, lo que sucede es que ese famoso numero de ticket osea el campo id_ticket se lo entragare a los usuarios que hagan el insert en las respectivas secciones...

por ejemplo si un usuario ingresa datos en la tabla:

actividades:
id_actividad,descripcion,notas,periodo,prioridad, fecha,firma, id_tipo

automaticamente hago que apenas luego de ese insert, hago otro en la tabla

tickets
id_ticket, id_record, id_tipo

donde id_ticket es el numero auto-incremet,
id_record es el valor de id_actividad apenas ingresado,
id_tipo es el campo de id_tipo de la tabla actividades ....

luego , al usuario le dare como numero de su ticket el numero del id_ticket apenas generado.... hasta aqui todo bien, ahora el problema esta cuando el usuario vendra con el numero de ticket osea el numero de id_ticket que le genere...

en select tendria que hacer la select de los datos relativos a ese id_ticket ... por ese t decia si tengo que hacer una subquery? porque solo me serviran los datos relativos a ese id_ticket ....

osea con ese id_ticket , tendria que conseguir hacer la select del record de la tabla

actividades
id_actividad,descripcion,notas,periodo,prioridad, fecha,firma, id_tipo

nose si me explique bien... alguna idea?? estoy usando html, php con mysql.

gracias...
  #17 (permalink)  
Antiguo 24/02/2016, 08:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: crear campo con prefijo increment

Cita:
Iniciado por italo_pm Ver Mensaje
luego , al usuario le dare como numero de su ticket el numero del id_ticket apenas generado.... hasta aqui todo bien, ahora el problema esta cuando el usuario vendra con el numero de ticket osea el numero de id_ticket que le genere...

en select tendria que hacer la select de los datos relativos a ese id_ticket ... por ese t decia si tengo que hacer una subquery? porque solo me serviran los datos relativos a ese id_ticket ....

osea con ese id_ticket , tendria que conseguir hacer la select del record de la tabla
Asi es con ese numero de ticket(que sera unico) vas a tener TU que sacar los demas datos, no se va a hacer automatico, por lo que tendras que crear subqueries o lo que necesites, sea cual sea tu esquema la informacion no se va a obtener sola.......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #18 (permalink)  
Antiguo 24/02/2016, 09:58
 
Fecha de Ingreso: enero-2011
Mensajes: 24
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: crear campo con prefijo increment

muchas gracias Libras, he pensado para poder hacer la select de la informacion completa de las tablas "madres" desde php primero tendria q hacer la select de la tabla tickets con el id_ticket , memorizo el campo id_tipo en una variable y luego hago un switch case con php donde en cada case si coincide con id_tipo entra y hago select de la tabla que me sirve, con su respectva subquery o join.. al menos es lo que acabo de pensar hehehehe lo pondre en practica para ver si es factible... o si es correcto hacerlo asi...

gracias nuevamente,

salu2

Etiquetas: campo, increment, prefijo, sql, tabla
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 05:58.