Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: дٳŦ٭ en 14 Diciembre 2009, 19:41 pm



Título: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 14 Diciembre 2009, 19:41 pm
Hola,

Tengo el siguiente problema..

Tengo 7 bases de datos, con datos del 1 al 1200, 1200 al 2300 y así.. son consecutivos pero están partidos  :xD bueno, me pasaron una base de datos concentrada con todas las filas que supuestamente están (o deberían estar en las mini bases).

La primer consulta es cómo puedo seleccionar las filas donde un entero sea diferente, digamos que tengo un numero en un campo y necesito sacar los número únicos de la base de datos concentrada.

La segunda es como puedo obtener las filas que NO estén en las mini bases pero que estén en la base de datos concentrada (ya únicas).

Es en Mysql.

Gracias de antemano,

Alfonso.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 14 Diciembre 2009, 19:47 pm
Bueno, ya resolví la primera con DISTINCT jeje  ;D


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: Azielito en 14 Diciembre 2009, 19:59 pm
a ver si te sirve esto, metes todos los registros en una base de datos llamada "completa", o sea, ahí metes las partes de la base de datos, entonces haces

Código
  1. CREATE TABLE `base_sin_duplicados` AS SELECT * FROM `completa` GROUP BY (id)

donde "id" es el identificador único, o tal vez entendi mal?


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 14 Diciembre 2009, 20:09 pm
Sí, sí funcionaría pero los IDs no están continuos, no puedo meterlos por IDs xD, por ejemplo, se me ocurrió como hacerlo en PHP..

por cada registro en la base de datos completa (ya filtrada){

        hago consulta a la primer mini base y comparo con el que tengo en el row del pimer for.. si no esta me sigo a la segunda hasta que llegue a la 7.
       
       si no la encuentro inserto en la nueva base de datos

                 }

Algo así tendría que ser..  :-\


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 14 Diciembre 2009, 20:23 pm
Vamos a ver lo que yo entiendo tu tienes 2 tablas por ejemplo, y tu quieres obtener los registros de 1 tabla pero que no aparezcan en la otra???? porque si fuera el caso seria algo asi:

Código
  1.  
  2. mysql> SELECT * FROM prueba;
  3. +----------+---------+
  4. | numerito | datitos |
  5. +----------+---------+
  6. |        1 |       1 |
  7. |        1 |       2 |
  8. |        4 |       1 |
  9. |        4 |       3 |
  10. +----------+---------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT * FROM ejemplo;
  14. +--------+-------+
  15. | numero | datos |
  16. +--------+-------+
  17. |      1 |     1 |
  18. |      2 |     2 |
  19. |      3 |     3 |
  20. |      4 |     4 |
  21. |      5 |     5 |
  22. +--------+-------+
  23. 5 ROWS IN SET (0.00 sec)
  24.  
  25.  
  26. mysql> SELECT ejemplo.numero FROM ejemplo WHERE ejemplo.datos NOT IN( SELECT num
  27. erito FROM prueba );
  28. +--------+
  29. | numero |
  30. +--------+
  31. |      2 |
  32. |      3 |
  33. |      5 |
  34. +--------+
  35. 3 ROWS IN SET (0.02 sec)
  36.  
  37.  


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 15 Diciembre 2009, 01:05 am
Con el ejemplo anterior te sirve, aunque la demostracion sea solo con 2 tablas. Cree 6 tables (En tu caso son 7) aunque desconozco en su totalidad que tipo de estructura poseen tus tablas, me imagino si es que tienen alguna relacion las 7 que deben tener 1 o mas campos donde concuerden siempre y asi poder retornar las consultas que macheen. En tu caso quieres todos los registros de una tabla particular donde dicho registro no exista o se repita en las otras 6 tablas. No es complicado mira otro ejemplo pero con mas de 2 tablas.

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +--------+-------+--------+
  4. | numero | datos | indice |
  5. +--------+-------+--------+
  6. |      1 |     1 |      1 |
  7. |      2 |     2 |      1 |
  8. |      3 |     3 |      1 |
  9. |      4 |     4 |      1 |
  10. |      5 |     5 |      1 |
  11. |      6 |     6 |      1 |
  12. |      7 |     7 |      1 |
  13. |      8 |     8 |      1 |
  14. |      9 |     9 |      1 |
  15. |     10 |    10 |      1 |
  16. |     11 |    11 |      1 |
  17. |     12 |    12 |      1 |
  18. |     13 |    13 |      1 |
  19. |     14 |    14 |      1 |
  20. +--------+-------+--------+
  21. 14 ROWS IN SET (0.00 sec)
  22.  
  23. mysql> SELECT * FROM prueba;
  24. +------+                    
  25. | fid  |
  26. +------+
  27. |    1 |
  28. |    1 |
  29. |    5 |
  30. +------+
  31. 3 ROWS IN SET (0.00 sec)
  32.  
  33. mysql> SELECT * FROM pruebax;
  34. +------+
  35. | id   |
  36. +------+
  37. |    1 |
  38. |    2 |
  39. |    5 |
  40. +------+
  41. 3 ROWS IN SET (0.00 sec)
  42.  
  43. mysql> SELECT * FROM pruebaxx;
  44. +------+
  45. | xid  |
  46. +------+
  47. |    4 |
  48. |    5 |
  49. |    6 |
  50. +------+
  51. 3 ROWS IN SET (0.00 sec)
  52.  
  53.  
  54.  
  55. mysql> SELECT * FROM pruebita;
  56. +------+                      
  57. | kid  |                      
  58. +------+
  59. |    4 |
  60. |    7 |
  61. |    8 |
  62. +------+
  63. 3 ROWS IN SET (0.00 sec)
  64.  
  65.  

Por ende tengo 6 tablas, y los datos que me interesan son los de la tabla ejemplo precisamente la fila numeros  que no concuerden con ningun campo de las demas tabls entonces:

Código
  1.  
  2. mysql> SELECT ejemplo.numero FROM ejemplo WHERE ejemplo.datos NOT IN( SELECT fid FROM prueba ) AND ejemplo.datos NOT IN( SELECT id FROM pruebax) AND ejemplo.datos NOT IN( SELECT xid FROM pruebaxx ) AND ejemplo.datos NOT IN( SELECT kid FROM pruebita ) AND ejemplo.indice = 1;
  3. +--------+
  4. | numero |
  5. +--------+
  6. |      3 |
  7. |      9 |
  8. |     10 |
  9. |     11 |
  10. |     12 |
  11. |     13 |
  12. |     14 |
  13. +--------+
  14. 7 ROWS IN SET (0.00 sec)
  15.  
  16.  

Analiza bien los registros de las tablas posteadas y comparalos a los registros de otras tablas, veras que solo aparecen aquellos numeros que no se reflejan en ninguna de las 6 tablas solicitadas.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: sempus en 15 Diciembre 2009, 16:51 pm

дٳŦ٭ depende si estamos hablando de datos de una tabla padre, porque en un tabla padre los datos practicamente no se repiten y no me refiero puramente al ID, pero si es una tabla Muchos, los datos se repiten y como sabras, aunque filtres por una subconsulta como lo hace ^TiFa^ el resultado seria erroneo, porque supon que tiene un codigo X en la tabla muchos, tal y como lo hace ^TiFa^ con una vez que aparezca el codigo X se jode el resultado, porque abria que ver cuantas veces deberia de estar dicho codigo X en tu tabla completa y tantas veces deberia de estar en las tablas separadas que tienes y que los datos sean identicos y suponiendo que sean resultados numericos, la suma deberia ser la misma, por eso, yo antes de intentar dar una solucion desearia que nos aclaremos el panorama que tienes con tus tablas y asi intentar ayudarte

o todo se rige por el correlativo? o podria ser que el correlativo de una no concuerde con la que esta completa?, o al concordar supuestamente estarian bien los datos? y solo buscariamos los correlativos faltantes?


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 15 Diciembre 2009, 17:53 pm
Sempus, aunque tu teoria es valida. Yo me guie de esto para poder deducir el modelo de las tablas ejemplos que expuse:

Citar
Tengo 7 bases de datos, con datos del 1 al 1200, 1200 al 2300 y así.. son consecutivos pero están partidos

El dice que son todos los datos son consecutivos pero divididos entre las 7 tablas.

Luego expone:

Citar
La segunda es como puedo obtener las filas que NO estén en las mini bases pero que estén en la base de datos concentrada (ya únicas).

Basandome en lo que el peticiona, 'datos unicos' estoy pensando que no se refiere a datos repetidos y en caso que sean repetidos (relacion de a muchos) deberian obviarse porque ya no son unicos sino que son repetidos.

A lo mejor interprete mal, pero me he guiado de valores consecutivos divididos entre varias tablas, y obtenet datos unicos en la tabla padre que no se repitan en la tablas hijos, y como la tabla padre asumo tiene valores 'unicos' (si esta bien modelado y estructurado el asunto) que se repitan los mismos valores en hijos deberia obviarse y no retornarse en la consulta... o al menos eso he entendido yo por su peticion de datos unicos que aparezcan en la tabla padre y que no matcheen o concuerden en las tablas hijos.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: sempus en 15 Diciembre 2009, 18:12 pm
nose, yo lo decia mas bien por otro lado xD , osea como que el numero de factura sea 0001, y evalues simplemente que esa factura exista en las tablas separadas, pero que exista no quiere decir que sea la misma porque el valor puede ser distinto asi como la Serie de la factura, mas bien por ese lado iba yo, aunque si tu y el recalcan el unico entonces supongo que ya no desea Reevaluar, mas bien yo lo decia por el lado de la Reevaluacion y lo digo porque el dice que la tabla completa esta unica (que entendi no la hizo el sino que se la dieron), pero no asi las separadas y que el separo con DISTINCT, y si fuese por ejemplo como el caso de una factura, ese DISTINCT me podria mentir, no lo he dicho por contradecirte ^TiFa^   :-*


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 15 Diciembre 2009, 18:18 pm
No chico como crees  :D  entiendo tu punto completamente, porque es valido... pero puestos que el dijo pidio eso desde un principio 'datos unicos que no se reflejen en las demas tablas' supuse lo que supuse....

Porque si fuese por lo que comentas (Que existe de hecho ese estructurado y es valido) entonces, su peticion ya no seria querer datos unicos de la tabla padre que no aparezcan en las demas tablas hijos.

Todo depende lo que el exponga, porque me he basado en una peticion vaga he deducido en base a esa peticion, pero si viera al menos ejemplo o modelo de las tablas, podria deducir de mejor manera realmente que es lo que el desea obtener.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 15 Diciembre 2009, 19:19 pm
Paso a explicarles  :)

Tengo exactamente 5 bases de datos en MySql a las cuales les podríamos llamar "mimi-bases", las cuales contienen registros de clientes:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Ahora, esas 5 bases de datos tienen los registros del 1 al 2000 (mini-base 1), 2000 al 4000 (mini-base 2) y asi consecutivamente.

Tengo una base de datos (que podemos llamar mamá) que concentra las 5 mini-bases, la tarea era obtener los codigos de promocion (campo codigodepromocion) únicos de la base de datos "mamá" (resuelto con DISTINTC), y a su vez ya teniendo una base de datos "pura" (ya que muchos se repiten), buscar los registros que estén en las bases de datos que tengan en el campo codigousado = NO.

Gracias  :)




Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 15 Diciembre 2009, 19:30 pm
Haber tu base de datos 'mama' tiene esto:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Y la consulta que realizaste con DISTINCT lo hiciste unicamente consultando a la tabla 'mama' o tuviste que comparar los datos de 'mama' con las 5 mini-bases????

La consulta que quieres donde debas retornar todos los registros del campo codigousado=NO es unicamente sobre la tabla 'mama'? o dicho campo codigousado tambien existe en las otras 5 mini-bases y quieres obtener el resultado de 'mama' y las 5 mini-bases en 1 sola consulta SQL donde el campo codigousado=NO en la tabla 'mama' y las 5 mini-bases????


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 15 Diciembre 2009, 20:47 pm
Citar
Haber tu base de datos 'mama' tiene esto:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Y la consulta que realizaste con DISTINCT lo hiciste unicamente consultando a la tabla 'mama' o tuviste que comparar los datos de 'mama' con las 5 mini-bases????

Yep.

Citar
La consulta que quieres donde debas retornar todos los registros del campo codigousado=NO es unicamente sobre la tabla 'mama'? o dicho campo codigousado tambien existe en las otras 5 mini-bases y quieres obtener el resultado de 'mama' y las 5 mini-bases en 1 sola consulta SQL donde el campo codigousado=NO en la tabla 'mama' y las 5 mini-bases????

Así es, también existe en las otras, están homologadas.

Gracias  :D


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 15 Diciembre 2009, 21:06 pm
Ok... pero, los registros finales que quieres obtener solo son los campos de la tabla 'mama' o quieres obtener otros campos que pertenecen a las 5 mini-tablas???? Si fuera mas o menos lo anterior expuesto, seria algo tipo:

SELECT DISTINCT mama.nombre, mini1.id_tienda, mini2.id_cliente FROM mama, mini1, mini2 WHERE mama.codigousado NOT IN( select mini1.codigousado FROM mini1 WHERE codigousado = NO ) AND mini1.codigousado NOT IN( selectt mini2.codigousado FROM mini2 WHERE codigousado = NO) AND mini1.id_cliente = mama.id_cliente AND mini2.id_cliente = mini1.id_cliente

No lo he probado, pero deberia ser algo similar a lo anterior.

Pero primero necesito saber si realmente existe referencia real identica entre  el campo codigousuario de 'mama' y las tablas 'minis'


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 16 Diciembre 2009, 00:23 am
Hola Tifa, muchas gracias por tu interés y ayuda.

Me quedaría con los registros de la base "mamá", en cuanto a referencia indentica también la hay ya que es un entero de 16 caracteres único. Precisamente por eso nencesito filtrarlos, para quedarme con los códigos NO usados. Probaré la query y os cuento.

Gracias, Alfonso.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 16 Diciembre 2009, 00:29 am
Igual y me van a querer matar  ;D pero no son bases, son tablas jeje.  :-\ perdón.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 16 Diciembre 2009, 00:32 am
A lo mejor es mucho pedir, pero creo que en esa parte Sempus tiene razon no puedo sugerir solucion en base a una idealizacion de un escenario expuesto por ti.

Sino es mucho pedir, podrias describirnos que campos continen la tabla mama y al menos 2 de las mini-base y colocar un ejemplo de los datos que tienen cada tabla y mas o menos la consulta final como te gustaria que salgan para uno tener una idea mas clara de como acomodar la consulta SQL. 

Porque por ejemplo si yo tuviera 2 tablas (me voy a basar en 2 tablas en este ejemplo):

Tabla mama:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Tabla Mini1

id_cliente INT
mensaje varchar(100)
codigousado CHAR [aqui le pongo si o no]


Si en tu caso que solo te interesan los registros de la tabla 'mama' no seria necesario comparar el campo codigousado de 'mama' con codigousado de 'Mini1' ya que si solo son los registros de 'mama' bastaria con un simple:

SELECT ...FROM 'mama' WHERE codigousado = 'NO'

Ahora, si tu quisieras vamos a suponer el registro nombre de la tabla 'mama' y el registro mensaje de la tabla 'Mini1' (suponiendo como ejemplo ) entonces ahi si, habria que dar un uso de JOIN con 'mama' y todas las tablas 'Mini1' y decir que codigousado = 'SI' en todas las tablas relacionadas en el JOIN o sea:

mama.codigousado = 'SI' AND Mini1.codigousado = 'SI' AND Mini2.codigousado = 'SI'

Y asi sucesivamente... pero ten en cuenta que no basta solamente con la expresion anterior, si las tablas fueron disenadas relacionandose una con la otra, en algun punto deberan concordar o ser identicas en el valor, entonces aqui entraria las primary key o indice de cada tabla del JOIN, quedando mas o menos tu consulta final con:

mama.codigousado = 'SI' AND Mini1.codigousado = 'SI' AND Mini2.codigousado = 'SI' AND Mini1.id_client = mama.id_client AND Mini2.id_client = mama.id_client

De lo contrario tendrias un producto cartesiano y datos no muy correctos del todo... por eso es importante en caso que no llegues a una solucion, poder ver parte (Aunque sean 5 lineas de registros) de los campos que poseen la tabla 'mama' y los hijos que quieres relacionarle.


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: дٳŦ٭ en 16 Diciembre 2009, 00:47 am
Tifa, tienes razón, las tablas tienen la siguiente estructura:

Código:
mysql> DESCRIBE clientesconcentrada;
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| id_clientes           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_tienda             | int(10) unsigned | NO   |     | NULL    |                |
| nombre        | varchar(255)     | YES  |     | NULL    |                |
| codigodepromocion     | int(16)          | YES  |     | NULL    |                |
| codigousado           | varchar(255)     | YES  |     | NULL    |                |
| registro              | date             | YES  |     | NULL    |                |
+-----------------------+------------------+------+-----+---------+----------------+

Ya extraí todos los registros que me resultaron del DISTINCT (de la tabla clientesconcentrada [mamá]), la tabla se llama clientesfiltrados, estas filas son únicas (diferenciandolas mediante el código de promoción), las cuales tengo que comparar con las otras tablas y ver cuales tienen en codigousado = no.

Esto es para ver que códigos están sin usar.

Gracias!!


Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 16 Diciembre 2009, 01:55 am
Ok lo que intentas decirme es que todas las tablas tienen los mismos campos los mismos valores y en el unico campo donde se diferencian es en 'codigopromocion'???

Si la respuesta es afirmativa, entonces cree 2 tablas identicas a la que me mostraste pero donde unicamente varian el valor de codigopromocion de cada una:

Código
  1.  
  2. mysql> SELECT * FROM clientesfiltrados;
  3. +-------------+-------------------+-------------+
  4. | id_clientes | codigodepromocion | codigousado |
  5. +-------------+-------------------+-------------+
  6. |           1 |              8888 | no          |
  7. |           2 |              6464 | si          |
  8. |           3 |              7373 | no          |
  9. |           4 |              6565 | si          |
  10. +-------------+-------------------+-------------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT * FROM clientesconcentrada;
  14. +-------------+-----------+--------+-------------------+-------------+
  15. | id_clientes | id_tienda | nombre | codigodepromocion | codigousado |
  16. +-------------+-----------+--------+-------------------+-------------+
  17. |           1 |         1 | Maria  |              8080 | no          |
  18. |           2 |         1 | Jose   |              9090 | si          |
  19. |           3 |         1 | Juan   |              7070 | no          |
  20. |           4 |         1 | Lucas  |              6060 | si          |
  21. +-------------+-----------+--------+-------------------+-------------+
  22. 4 ROWS IN SET (0.00 sec)
  23.  
  24.  

Ambas tablas tienen los mismos datos en todos los campos (A excepcion de codigodepromocion como me estas diciendo) Por ende la siguiente consulta SQL seria valida si quieres obtener todos los codigodepromocion (De las 2 tablas en este caso) donde el valor sea 'NO'

Código
  1.  
  2. mysql> SELECT clientesconcentrada.codigodepromocion AS Codigo_Concentrada, clientesfiltrados.codigodepromocion AS Codigo_Filtrado FROM clientesconcentrada INNER JOIN clientesfiltrados ON (clientesfiltrados.id_clientes = clientesconcentrada.id_clientes) WHERE clientesfiltrados.codigousado = 'no' AND clientesconcentrada.codigousado = 'no';
  3. +--------------------+-----------------+
  4. | Codigo_Concentrada | Codigo_Filtrado |
  5. +--------------------+-----------------+
  6. |               8080 |            8888 |
  7. |               7070 |            7373 |
  8. +--------------------+-----------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

Donde:

Código
  1.  
  2. mysql> SELECT codigodepromocion FROM clientesconcentrada WHERE codigousado = 'no';
  3. +-------------------+
  4. | codigodepromocion |
  5. +-------------------+
  6. |              8080 |
  7. |              7070 |
  8. +-------------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

Y donde:

Código
  1.  
  2. mysql> SELECT codigodepromocion FROM clientesfiltrados WHERE codigousado = 'no';
  3. +-------------------+
  4. | codigodepromocion |
  5. +-------------------+
  6. |              8888 |
  7. |              7373 |
  8. +-------------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

En tu caso que son 5 tablas, haces lo mismo en el JOIN quedando mas o menos:

Código
  1.  
  2. SELECT clientesconcentrada.codigodepromocion AS Codigo_Concentrada, clientesfiltrados.codigodepromocion AS Codigo_Filtrado, Mini1.codigodepromocion AS Codigo_Mini FROM clientesconcentrada, clientesfiltrados, Mini1 ON (clientesfiltrados.id_clientes = clientesconcentrada.id_clientes)  WHERE Mini1.id_clientes = clientesconcentrada.id_clientes AND clientesfiltrados.codigousado = 'no' AND clientesconcentrada.codigousado = 'no' AND Mini.codigousado = 'no';
  3.  
  4.  




Título: Re: Seleccionar datos únicos, comparar con otra base, dos consultas
Publicado por: ^Tifa^ en 16 Diciembre 2009, 02:27 am
Se me paso decirte, pero de consejo esto:

Citar
mysql> DESCRIBE clientesconcentrada;
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| id_clientes           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_tienda             | int(10) unsigned | NO   |     | NULL    |                |
| nombre               | varchar(255)     | YES  |     | NULL    |                |
| codigodepromocion     | int(16)          | YES  |     | NULL    |                |
| codigousado           | varchar(255)     | YES  |     | NULL    |                |
| registro              | date             | YES  |     | NULL    |                |
+-----------------------+------------------+------+-----+---------+----------------+

el campo nombre le asignaste una longitud varchar de 255  :-\  (Que nombre te ocuparia tanto espacio) lo mismo con codigousado que me informaste que solo guarda 2 registros o 'si' o 'no' sin embargo tambien tiene una longitud 255 en varchar  :-\  seria suficiente que alteraras la o las tablas con estos respectivos valores por  codigousado char(3)  y nombre varchar(50) tambien recuerda no permitir ni dejar valores NULL insertarse en la tabla  ;)