Estoy configurando una base de datos con phpMyAdmin. Tengo dos tablas (foo
y bar
), indexadas en sus claves primarias. Estoy tratando de crear una tabla relacional (foo_bar
) entre ellas, utilizando sus claves primarias como claves foráneas.
Creé estas tablas como MyISAM, pero desde entonces he cambiado las tres a InnoDB, porque he leído que MyISAM no soporta claves foráneas. Todos los campos id
son INT(11)
.
Cuando elijo la tabla foo_bar
, hago clic en el enlace "vista de relación", e intento establecer las columnas FK para que sean database.foo.id
y database.bar.id
, dice **"¡No hay índice definido!"junto a cada columna.
¿Qué me falta?
Para simplificar, quiero seguir usando phpMyAdmin. Actualmente estoy usando XAMPP, que es lo suficientemente fácil como para permitirme centrarme en el PHP/CSS/Javascript, y viene con phpMyAdmin.
Además, aunque todavía no he podido configurar claves externas explícitas, tengo una tabla relacional y puedo realizar uniones como esta:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
Simplemente me incomoda no tener las FKs definidas explícitamente en la base de datos.
Si quiere utilizar phpMyAdmin para establecer relaciones, tiene que hacer dos cosas. En primer lugar, tiene que definir un índice en la columna de clave foránea en la tabla de referencia (por lo que foo_bar.foo_id, en su caso). A continuación, vaya a la vista de la relación (en la tabla de referencia) y seleccione la columna referida (en su caso foo.id) y las acciones de actualización y eliminación.
Creo que las claves foráneas son útiles si tienes varias tablas vinculadas entre sí, en particular, tus scripts de borrado serán muy cortos si configuras las opciones de referenciación correctamente.
EDIT: Asegúrese de que ambas tablas tienen el motor InnoDB seleccionado.
phpMyAdmin le permite definir claves foráneas usando su vista "relaciones". Pero desde, MySQL sólo admite restricciones extranjeras en "INNO DB" tablas, el primer paso es asegurarse de que las tablas que está utilizando son de ese tipo.
Para configurar una clave foránea para que la columna PID en una tabla llamada CHILD haga referencia a la columna ID en una tabla llamada PARENT, puede hacer lo siguiente:
Al hacer una exportación en la tabla CHILD, debería ver que se ha creado una restricción de clave foránea para la columna PID.
InnoDB permite añadir una nueva restricción de clave foránea a una tabla utilizando ALTER TABLE:
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
Por otro lado, si MyISAM tiene ventajas sobre InnoDB en su contexto, por qué querría crear restricciones de clave foránea en absoluto. Usted puede manejar esto en el nivel de modelo de su aplicación. Sólo asegúrese de que las columnas que desea utilizar como claves foráneas están indexadas.