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

Como meter mas de una llave foranea en una tabla

Estas en el tema de Como meter mas de una llave foranea en una tabla en el foro de Mysql en Foros del Web. tengo un problema con dos llaves foraneas que quiero meter en una tabla, la tabla tiene los sig datos por ahora: create table recurso (id ...
  #1 (permalink)  
Antiguo 11/09/2008, 16:56
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Como meter mas de una llave foranea en una tabla

tengo un problema con dos llaves foraneas que quiero meter en una tabla, la tabla tiene los sig datos por ahora:

create table recurso (id int(11) not null autoincrement, nombre varchar (20) not null, peso varchar (5) not null, extension varchar (5) not null, ruta varchar (200) not null, primary key (id)) engine=innodb;

El caso es que esta tabla la quiero referenciar con otras dos que son

tabla tipo:

create table tipo (id int not null, nombre varchar (20), primary key (id)) engine=innodb;

tabla producto:

create table producto (id int not null, tipo varchar (15) not null, subtipo varchar (15) not null, nombre varchar (20) not null, primary key (id)) engine=innodb;


por ahorita solo trato de insertar la primera clave foranea para referenciar con la tabla tipo despues inserto la otra o si es que se puede hacer a la vez agradeceria de antemano. Lo que trate de hacer fue lo siguiente:

alter table recurso add id_tipo_fk FOREIGN KEY (id_tipo) references tipo (id) on update cascade;

con lo que quise insertar un dato llamado id_tipo para clave foranea referenciando con la tabla tipo atravez de su (id) respectivo.

Espero me ayuden un saludo a todos de antemano.
  #2 (permalink)  
Antiguo 12/09/2008, 09:50
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, 5 meses
Puntos: 2658
Respuesta: Como meter mas de una llave foranea en una tabla

La forma más simple de agregar claves foráneas (FK) a una tabla es crearlas directamente
Código:
ALTER TABLE recurso 
ADD FOREIGN KEY (id_tipo) REFRENCES tipo (id) 
ON UPDATE CASCADE;
Si lo que quieres es indicar un nombre de índice definido para esa CONSTARINT, lo tienes que definir:

Código:
ALTER TABLE recurso 
ADD CONSTRAINT nombreconstraint FOREIGN KEY (id_tipo) REFRENCES tipo (id) 
ON UPDATE CASCADE;
Las tres condiciones mínimas y básicas para que de resultado son:
1. La tabla referida, debe existir ANTES de hacer esta declaración. Sino dará error.
2. El campo referido DEBE ser clave en su tabla. Existen dos posibilidades: Por default debes ser la PRIMARY KEY, de no existir, se puede usar un campo definido como UNIQUE.
3. Si la tabla referida tiene la clave compuesta, debe existir un campo por cada parte y estar referida TODA la clave.

Fuera de eso, no deberías tener problemas en hacer las FK aunque sean de muchas tablas. Se puede incluso construir tablas relacionales que sólo contienen FKs
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/09/2008 a las 10:01
  #3 (permalink)  
Antiguo 12/09/2008, 12:33
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Como meter mas de una llave foranea en una tabla

Gracias por tu respuesta mi buen gnzoloyo acabo de hacer lo que me indicaste arriba las dos formas:

ALTER TABLE recurso
ADD FOREIGN KEY (id_tipo) REFRENCES tipo (id)
ON UPDATE CASCADE;

y tambien intente con:

ALTER TABLE recurso
ADD CONSTRAINT nombreconstraint FOREIGN KEY (id_tipo) REFRENCES tipo (id)
ON UPDATE CASCADE;

Pero me marca el mismo error que ayer: ERROR 1072 (42000): key column 'id_tipo' doesn't exist in table.

Espero que me ayudes por favor ok.
Pues que Como dices tu ¿Quien de sus aciertos aprende ? si yo aprendo de mis errores constantemente.
  #4 (permalink)  
Antiguo 12/09/2008, 13: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: 16 años, 5 meses
Puntos: 2658
Respuesta: Como meter mas de una llave foranea en una tabla

key column 'id_tipo' doesn't exist in table.:

La columna 'id_tipo' no existe en la tabla.

Estás tratando de definir al campo 'id_tipo' como FK, pero en la tabla recurso no hay ningún campo que se llame 'id_tipo'...
__________________
¿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 12/09/2008, 13:59
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Como meter mas de una llave foranea en una tabla

Estás tratando de definir al campo 'id_tipo' como FK, pero en la tabla recurso no hay ningún campo que se llame 'id_tipo'...

Osea que tengo que crear un campo en la tabla recurso con el mismo nombre

osea id_tipo solo asi habra buenos resultados? y si meto este campo en la tabla

recurso lo declararia tambien como FK?

Creo que ya me empece a enredar ayudame porfa sip.
  #6 (permalink)  
Antiguo 12/09/2008, 17:28
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, 5 meses
Puntos: 2658
Respuesta: Como meter mas de una llave foranea en una tabla

Empecemos por el principio:
1. Un FK es un campo de una tabla cuyo valor (o dominio) depende de la clave de otra tabla. Esto implica que lo que se hace es definir que un determinado campo de una tabla tenga como propiedad la de depender para su aceptación que en otra tabla exista el valor que ese campo contiene.

2. Como es FOREIGN KEY (clave foranea, ajena o extranjera), en el momento de creación el motor de la abse verifica que exista en la otra tabla el campo según el nombre indicado en REFERENCES nombredelatablatabla(nombredelcampo) y que el mismo sea PRIMARY KEY o KEY de un índice tipo UNIQUE.

3. En el momento en que da por válida la asignación de la propiedad FK a un campo, crea un índice que controlará la relación, y en donde están presentes las dos claves (la de la tabla referida y la de la tabla donde está el campo FK). SI no se indica un nombre, el motor le asigna uno aleatorio o según un patrón basado en el nombre de las tablas. Si se le quiere asignar un nombre, se debe indicar antes del REFERENCES con la estructura: CONSTRAINT nombredelindice. CONSTRAINT en este contexto significa RESTRICCIÓN. Un FK es por definición una restricción que se asigna al dominio de un campo en una tabla.

¿Se entiende ahora?
__________________
¿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/09/2008, 09:12
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Como meter mas de una llave foranea en una tabla

OK muchisimas gracias creo que lo de arriba que mencionas ya lo tenia entendido solo que me enrrede un poco pues aun no le agarro bien la honda a MYSQL y los mensajes que manda cada que corro los ejercicios creados no le entiendo, pero te agradezco de antemano pues respondes bien mis dudas como un verdadero master y espeo seguir contando con tu apoyo, vas a ser de gran ayuda para los que apenas estamos empezando con MYSQL y no te preocupes si no tienes tiempo de checar el foro yo esperare tus respuestas ok.

Creo que ahora solo falta modificar el campo que introduje como FK a not null y tratare de meter la otra clave foranea que me hace falta haber que honda solo una pregunta como le ago para saber si esta relacion entre tablas funciona?
  #8 (permalink)  
Antiguo 17/09/2008, 13:41
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, 5 meses
Puntos: 2658
Respuesta: Como meter mas de una llave foranea en una tabla

El motor de base de datos se encarga de hacer que funcione. Uno, como programador, es responsable de saber en qué secuencia tienen que entrar los datos, es decir, qué tabla cargar primero. En eso consiste la cosa.

De todos modos, hay un control específico que se puede hacer a nivel de aplicación y que consiste en capturar el número de error que se produce:

Cada sentencia que envías a una conexión de una base de datos devuelve por la misma conexión un número, o un mensaje. Por ejemplo, un simple "SELECT..." si funciona bien, devuelve un número que es la cantidad de registros afectados (al menos en .Net), o negativo si falló, caso en el cual puedes rescatar el mensaje o el código de error.

Si estás programando en .Net esto se maneja usando el conector .Net de MySQL, de modo de administrar vía el Try... Catch ... As MySqlException ... End Try, la exceptción que indica un problema en la base.
De esta forma puedes saber qué pasó e indicarle al usuario qué debe hacer.

Si estás programando en PHP, será mejor que preguntes en el foro de PHP, pero el PHP también cuenta con funciones que capturan el mensaje de error y su código.

Por experiencia propia, es mucho más sencillo si programas la aplicación para que no deje a los usuarios ingresar datos para almacenar en tablas secundarias sin que primero existan los datos necesarios en las tablas primarias... Te ahorrará muchos dolores de cabeza.
__________________
¿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 21/09/2008, 14:50
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Como meter mas de una llave foranea en una tabla

Hola mi estimado gnzsoloyo andaba un poco ocupado con otras tareas y pues cuando he querido escribirte el sistema no manda lo que esc no se que honda pero bueno una molestia mas respecto a tu ultima recomendacion realice lo siguiente:

INSERT INTO cliente (id, empresa, contacto, telefono, direccion, id_maic)
VALUES
(1,
’COMPANY’,
’personaX’,
'7647674249',
’17 junio sur no. 11’
1 ’);
y me marca el siguiente error: ERROR 1064 (42000): you have an error in your SQL sintax; check the manual that correspons to you MYSQL server version for the right sintax to use near '
(1,
'COMPANY',
,'personaX',
[in' at line 1 y pues si sigo dando enter
->
->
->

Supongo que hay un error de sintaxis al dar las instrucciones y me gustaria saber como le puesdo hacer para solucionar el problema.
En donde me pusiste "este valor falta" ’ESTE VALOR FALTA ’);[/indent]puse 1 que crei que tenia que ser al modulo al que me referia por el id_maic o que debo poner? y pues mi ultima duda es respecto a ’);[/indent]aqui [b][color=Red que funcion tiene? acaso un color? la verdad me confundi un poco.


Bueno pues espero que resuelvas mis dudas cuidate mucho y que estes bien OK, espero tu respuesta sale.
  #10 (permalink)  
Antiguo 21/09/2008, 18:37
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, 5 meses
Puntos: 2658
Respuesta: Como meter mas de una llave foranea en una tabla

Los indent fueron un error de las etiquetas en el mensaje. Las etiquetas highlight no admiten control de textos del tipo indentación, así que no les prestes atención. El rojo era para resaltar que te estabas olvidando de un campo.

El error que estás cometiendo es doble:

1. No has separado el último dato del penúltimo con la coma...

2. El segundo es un error casi imperceptible: Estás usando acentos graves(´) para encerrar las cadenas y debes usar apóstrofes (').

Además hay un detalle que es un vicio generalizado de casi todos los foristas: Si vas a ingresar un dato numérico en un campo numérico, no lo ingreses como string. Estás obligando a MySQL a realizar una conversión implícita, y si bien cuando ingresas unos pocos registros es imperceptible, si lo haces con cuatro o cinco millones de registros en una consulta ( y eso simplemente sería un JOIN entre dos tablas de 2.000 registros cada una), afecta la performance en forma progresiva.

En definitiva, lo que tienes que ingresar es:
Código sql:
Ver original
  1. INSERT INTO cliente (id, empresa, contacto, telefono, direccion, id_maic)
  2. VALUES
  3.     (1, 'COMPANY', 'personaX', '7647674249',  '17 junio sur no. 11' ,  1);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/09/2008 a las 18:42
  #11 (permalink)  
Antiguo 22/09/2008, 12:06
Avatar de JACRUZI  
Fecha de Ingreso: septiembre-2008
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Como meter mas de una llave foranea en una tabla

Hola mi stimado gnzsoloyo nuevamente mil gracias por tu valiosisima ayuda
ya he podido insertar mis datos ahora espero no tener mas problemas mas adelante por cualquier cosa espero seguir contando con tu apoyo, sin duda este foro es genial y veo que has ayudado s muchas personas incluyendome y la verdad para explicar los temas eres todo un genio.

Sigue asi ok, y bien dicho eso de: ¿Quien de sus aciertos aprende ? si yo aprendo de mis errores constantemente. Y en esta ocacion aprendi muchas cosas gracias a ti.
Bueno cuidate mucho y que estes bien.
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 20:17.