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

Foreign key

Estas en el tema de Foreign key en el foro de Bases de Datos General en Foros del Web. Hola Quiero tener las siguientes tablas: TABLA 1 ------------- CVE TABLA1 */LLAVE PRIMARIA/* DES TABLA1 FCH TABLA1 TABLA 2 ------------- CVE TABLA2 */LLAVE PRIMARIA/ * ...
  #1 (permalink)  
Antiguo 25/07/2011, 08:46
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Foreign key

Hola

Quiero tener las siguientes tablas:

TABLA 1
-------------
CVE TABLA1 */LLAVE PRIMARIA/*
DES TABLA1
FCH TABLA1


TABLA 2
-------------
CVE TABLA2 */LLAVE PRIMARIA/ *
CVE TALBA1 */FOREIGN KEY/*


Por ejemplo, se que para poner la fila cve tabla2 como primary key tengo que poner el siguiente codigo:

ALTER TABLE `TABLA 2` ADD PRIMARY KEY ( `CVE TABLA2` )

Pero con que instruccion hago para poner a CVE TABLA1 como foreign key de la tabla 2 y uqe al introducir dicho valor tambien se introduzca en la tabla uno?

Gracias
  #2 (permalink)  
Antiguo 25/07/2011, 08: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: Foreign key

Manual de referencia: 15.6.4. Restricciones (constraints) FOREIGN KEY
Al final tienes el ejemplo que necesitas.
__________________
¿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 25/07/2011, 08:52
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

Gracias

Por cierto, una duda, para que vale un index en una tabla?
  #4 (permalink)  
Antiguo 25/07/2011, 08:59
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: Foreign key

Son requerimientos de la implementación de InnoDB. Si lees más arriba en el artículo verás que hace referencia a ellos.
Además, toda FK genera un índice (el symbol), porque es el índice el que se usa para mantiener la consistencia de esa relación.
Cita:
InnoDB necesita que haya índices sobre las claves foráneas y claves referenciadas, así las verificaciones de claves foráneas pueden ser veloces y no necesitan recorrer la tabla. En MySQL 5.0, el índice en la clave foránea se crea automáticamente. Esto contrasta con versiones más antiguas (anteriores a 4.1.8), donde los índices debían crearse explícitamente o fallaba la creación de restricciones de claves foráneas.
__________________
¿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 25/07/2011, 09:13
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

Pero en mi caso, por ejemplo, tengo las siguietnes tablas, dw_d_ano y dw_d_mes:

CREATE TABLE IF NOT EXISTS `ANO` (
`ANO` int(10) NOT NULL,
`ID_ANO` varchar(10) NOT NULL,
`DES_ANO` varchar(50) NOT NULL,
`FCH_CARGA` date NOT NULL,
`FCH_CAMBIO` date NOT NULL,

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE `ANO` (
ADD PRIMARY KEY (`ANO`)
)


CREATE TABLE IF NOT EXISTS `MES` (
`MES` int(10) NOT NULL,
`ANO` int(10) NOT NULL,
`ID_MES` varchar(10) NOT NULL,
`DES_MES` varchar(50) NOT NULL,
`FCH_CARGA` date NOT NULL,
`FCH_CAMBIO` date NOT NULL,

)


ALTER TABLE `MES`(
ADD PRIMARY KEY (`MES`),
ADD FOREIGN KEY (`ANO`) REFERENCES `ANO` (`ANO`)
)


Creo que he puesto bien la referencia, para que cve_ano de la tabla de mes sea foreign key de la tabla de ano. Ahora como haria el indice para que todo funcionara bien?

Gracias

Por cierto, al final segui tu consejo y aprendi a hacerlo yo, jejjee
  #6 (permalink)  
Antiguo 25/07/2011, 09:17
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: Foreign key

No puedes declara FK con tablas MyISAM, como las que usas, ni tampoco entre tablas InnoDB y MyISAM.
las FK sólo las puedes usar con tablas InnoDB.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `ANO` (
  2. `ANO` int(10) NOT NULL,
  3. `ID_ANO` varchar(10) NOT NULL,
  4. `DES_ANO` varchar(50) NOT NULL,
  5. `FCH_CARGA` date NOT NULL,
  6. `FCH_CAMBIO` date NOT NULL,
  7.  
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- <-- Aqui estas usando MyISAM...
__________________
¿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 25/07/2011, 09:20
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

Código MySQL:
Ver original 
Así entonces? Viendo ejemplos apostaria a que si, pero lo que no se es lo del index...
  #8 (permalink)  
Antiguo 25/07/2011, 09:25
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: Foreign key

Siendo que tanto la PK como la FK son de un sólo campo, podemos hacerlo así:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `ANO` (
  2. `ANO` int(10) NOT NULL PRIMARY KEY,
  3. `ID_ANO` varchar(10) NOT NULL,
  4. `DES_ANO` varchar(50) NOT NULL,
  5. `FCH_CARGA` date NOT NULL,
  6. `FCH_CAMBIO` date NOT NULL
  7.  
  8. CREATE TABLE IF NOT EXISTS `MES` (
  9. `MES` int(10) NOT NULL PRIMARY KEY,
  10. `ANO` int(10) NOT NULL,
  11. `ID_MES` varchar(10) NOT NULL,
  12. `DES_MES` varchar(50) NOT NULL,
  13. `FCH_CARGA` date NOT NULL,
  14. `FCH_CAMBIO` date NOT NULL,
  15. INDEX(`ANO`),
  16. CONSTRAINT fk_anno FOREIGN KEY (`ANO`) REFERENCES `ANO`(`ANO`)
__________________
¿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 25/07/2011, 09:29
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

El ejercicio me obliga a usar el siguiente codigo


CREATE <TIPO INDICE> INDEX <NOMBRE INDICE> ON <NOMBRE TABLA> ((NOMBRE COLUMNA))

POR LO QUE YO PONDRIA SOLO EL INDICE SIGUIETNE:

CREATE INDEX IDX_ANO ON ANO(ANO)
  #10 (permalink)  
Antiguo 25/07/2011, 09:33
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: Foreign key

Los INDEX de esos campos no son índices para esa forma. Son para el uso de las FK.
En todo caso, crea las FK como dice el manual. Lo importante del problema es que no uses las tablas MyISAM.

P.D:: En tu primero post no veo que menciones que se trata de un ejercicio. Los ejercicios usan formas didácticas, que no necesariamente son buenas prácticas cuando trabajas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 25/07/2011, 09:37
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

A ver, el problema esta en que no se como crear el indice. Te comento tengo varias tablas y una ultima tabla de hechos formada por las primary keys de las otras tablas (que aqui seran foreign keys).


entonces me imagino que tendre que particionar esa tabla mediante indices para que sea mas rapida la busqueda de esas foreing keys no?

Última edición por Gothgauss; 25/07/2011 a las 09:42
  #12 (permalink)  
Antiguo 25/07/2011, 09: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: 16 años, 5 meses
Puntos: 2658
Respuesta: Foreign key

Cita:
entonces me imagino que tendre que particionar esa tabla mediante indices para que sea mas rapida la busqueda de esas foreing keys no?
¿Por qué?
De todos modos, desde el momento en que esas columnas sean FK, ya habrá índices defnidos en ellas... ¿para qué quieres crear más índices? Los índices debe crearse según reales encesidades, no "por si"... ya que afectan la performance de las inserciones/actualizaciones.
De hecho, si los valores buscados están en esos índices que administran las FK, la tabla ni siquiera se lee. MySQL leerá el índice solamente...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 25/07/2011, 09:49
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: Foreign key

Cita:
A ver, el problema esta en que no se como crear el indice.
Acostúmbrate a leer el manual de referencia. Si lo haces verás que al inicio, en el mismo artículo está este párrafo:
Cita:
En la tabla referenciada, debe haber un índice donde las columnas referenciadas se listen en primer lugar, en el mismo orden. En MySQL/InnoDB 5.0, tal índice se creará automáticamente en la tabla referenciada si no existe aún.
Traducción: Crea la FK. Del indice que necesita se encarga MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 25/07/2011, 10:02
 
Fecha de Ingreso: marzo-2009
Mensajes: 395
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Foreign key

Pero ya he creado las fk, el problema esta en que el ejercicio uqe me mandan hacer mme exige que particione la tabla de hechos y que cree un indice.

Si quieres te paso por pm el ejercicio y lo que llevo hecho, para que veas si voy bine o no
  #15 (permalink)  
Antiguo 25/07/2011, 10:06
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: Foreign key

Bueno, esos son detalles que varían de acuerdo a lo que el profesor quiera lograr con el ejercicio. En la vida real esas cosas se resuelven según las necesidades del sistma, no por la ocurrencia de los analistas.
Ajustate a lo que el docente pide, por irreal que te parezca.
Simplemente hazlo.
Encuanto a la sintaxis de la creación de los índices, eso también lo encontrarás en el manual de referencia:13.1.4. Sintaxis de CREATE INDEX

No te olvides que siempre, ante cualquier duda: RTFM!


__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: key, tabla, foreignkey, bases-de-datos
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 09:38.