entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Como agrego una foreign key de tipo Integer para asociar dos tablas en mysql?

Hola como estan!, tengo una base de datos con mas de 12,000 registros, es decir, 12,000 catalogos en una sola tabla, por lo que opte por descomponerla en varias tablas sin perder la relacion de los datos de cada fila con cada columna, pero al asignar una foreign key con tipo de dato INT me sale un error, espero haberme explicado y puedan ayudarme, gracias!

1voto

Leonardo-Tadei comentado

Enviá la query que estás ejecutando para agregar la clave foránea y el error que te da, así podemos ayudarte.

PD: tener una tabla de 12 mil registros en MySQL no es un número grande. Podés trabajar sin problemas con tablas de cientos de miles de registros. Si el acceso a los datos es por campos clave (acceso, joins, etc) ni siquiera hay una baja de velocidad apreciable.

0voto

iphp comentado

Hola!!, el detalle es que no se si lo estoy haciendo bien, corrígeme si me equivoco y entonces paso el query porque sino tal vez nos vallamos a mal entender, dividí las tablas para hacer consultas según los campos, por ejemplo:

Tengo los 12,000 registros
Tabla Catalogos

id_catalogo, num_inventario, autor, titulo, tipo,subtipo, otro_campo....hasta el campo 32
1 P001 Ignacio
2 P004 Ignacio
3 P005 Martin
Hasta el 12 mil y cacho......
Un autor puede tener muchos catálogos, y pasa lo mismo con tipo,subtipo y con mas campos

Entonces hice una tabla llamada autores, una de tipos y una de subtipos de acuerdo?, ahora... en la tabla catalogos como le asigno el autor que le corresponda a cada catalogo?, si se supone que ahora la fila en vez de decir Ignacio, sera un numero en este caso el id o clave foránea de la tabla autores, Gracias!! Leonardo

PD: Ojala me sigas teniendo paciencia, creo que te haz dado cuenta que no soy un experto en esto

1voto

Leonardo-Tadei comentado

Yo tengo paciencia... pero sin dudas tenés que aprender a normalizar.
Te pongo una respuesta más abajo...

2 Respuestas

1voto

gderas2 Puntos1780

Una opción es crear una tabla temporal, así como se creó la tabla de autores, como cada autor ya es único lo que se puede hacer es hacer una consulta entre los autores y la tabla donde están los catálogos pero el join se debe realizar con el campo donde almacenan los nombres, algo así:

select autor.id, autor.nombre, catalogo.nombre , catalogo.id, catalogo.* from catalogo inner join autor on (autor.nombre = catalogo.nombre);

Prueba realizar la consulta y después seleccionas solo los campos que desees y luego creas la tabla, como se hizo la división.

(Esto es continuación de otro post)

0voto

iphp comentado

No logro entender bien el query :/, la tabla donde están los catálogos se llama "pat_material" y el campo donde esta el nombre del autor se llama "autor", el id se llama id_pat, la tabla que ya me cree con los autores se llama autores y el campo donde esta el nombre del autor aquí si se llama "nombre", osea que solo tiene dos campos, id_autor y nombre

Como quedaría el join???

(Una disculpa también publique en el otro post porque me siento un poco desesperado ojala me puedan entender)

1voto

gderas2 comentado

Básicamente seria volver a crear la tabla patmaterial en base a la consulta, esta sería algo asi:

SELECT
patmaterial.idpat
, autores.id_autor
, patmaterial.libro
FROM
patmaterial
INNER JOIN autores
ON (patmaterial.autores = autores.nombre);

De patmaterial pones los campos que quieres mostrar en la consulta, cuando ya tengas la consulta creas la tabla de la misma forma que dividiste la tabla "Original".

2votos

Leonardo-Tadei Puntos227320

Hola iphp,

adivinando lo que estás queriendo hacer, te quedarían:

Tabla Tipos
id
nombre

Tabla SubTipos
id
id_tipo
nombre

Tabla Autor
id
nombre
apellido
etc

Tabla Catálogos
id
id_autor
id_subtipo
etc

Para obtener los Catálogos de un Autor sería:

SELECT C.* FROM (Catalogos AS C, Autores AS A) WHERE C.id_autor=A.id

es decir, todos los campos de la tabla Catálgos, relacionada con los Autores, en dónde el id del Autor es igual al id_autor en el Catálogo.

Para rearmar todos los datos:

SELECT C.id, C.id_autor, A.nombre, A.apellido, T.nombre, ST.nombre, demás campos que quieras
FROM (Catalogos AS C, Autores AS A, Tipos AS T, SubTipos AS ST)
WHERE C.id_autor=A.id
AND C.id_subtipo=ST.nombre
AND ST.id_tipo=T.id

Estoy usando alias de los nombres de las tablas solo para escribir menos, pero da lo mismo. Hacer esto no requiere que definas claves foráneas ni nada (la función de las foreing key es otra: se trata de integridad, pero la query quedaría igual)

A la última query la podés filtrar a su vez por un id_autor, ordenarlas por algún criterio, etc.

Si esto no te alcanza para resolver esta cuestión @iphp, entonces nos vas a tener que enviar en otra pregunta las escructuras de las tablas, para ver en concreto qué estás haciendo.

Saludos cordiales!

1voto

iphp comentado

Muy buen día! @Leonardo-Tadei por supuesto que seguí tu consejo de aprender a normalizar las bases de datos, leí, estudie, practique y me di a la tarea de diseñar mi modelo E-R para seguir con el modelo relacional y posterior a eso normalizar de acuerdo a lo que necesitaba. Pero después el problema se me presento por el hecho de que la base de datos que estaba diseñando ya tenia una estructura previa ya que tuve que exportarla de access a mysql y entonces a esos 12300 registros aplicar mi diseño normalizado, ahí es cuando comencé a confundirme de como aplicarlo sin perder toda esa información que ya tengo y que es imprescindible no tener que volver a hacer todos esos registros de nuevo.

Voy a probar la consultas que me mandas, pero de todos modos haré otro post con las imágenes de la estructura de mi base de dtaos para hacer esto mas entendible.

Saludos y muchas gracias nuevamente!!

PD: La estructura de tablas que formaste es precisamente lo que quiero hacer, agradecería tu opinión si crees que es conveniente y estoy normalizando bien.

1voto

Leonardo-Tadei comentado

Resumiendo: tenés tus tablas normalizadas por un lado, y por otro tenés lo que exportaste de MS Access que no está normalizado.

Entonces tu problema es de "migración de datos": tenés que migrar lo que exportaste al formato en que va a trabajar el sistema.

Si es así, lo que tendrás que hacer son scripts que lean la tabla exportada y vayan poniendo los datos en las tablas qué correspondan.

Por tu pregunta, parecía que tenías un problema al escribir las querys, y no que tenías que pasar los datos de un formato a otro...

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta