Estoy configurando una base de datos usando phpMyAdmin. Tengo dos tablas ( foo
y bar
), indexadas en sus claves principales . Estoy tratando de crear una tabla relacional ( foo_bar
) entre ellos, usando sus claves principales como claves foráneas.
Creé estas tablas como MyISAM, pero desde entonces he cambiado las tres a InnoDB, porque leí que MyISAM no admite claves foráneas. Todos los id
campos son INT(11)
.
Cuando elijo la foo_bar
tabla, hago clic en el enlace "vista de relación" e intento configurar las columnas FK para que aparezcan database.foo.id
y database.bar.id
dice "¡No hay índice definido!" al lado de cada columna.
¿Qué me estoy perdiendo?
Aclaración / Actualización
En aras de la simplicidad, quiero seguir usando phpMyAdmin. Actualmente estoy usando XAMPP, que es lo suficientemente fácil como para permitirme enfocarme en PHP / CSS / Javascript, y viene con phpMyAdmin.
Además, aunque todavía no he podido configurar claves foráneas explícitas, sí 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 los FK definidos explícitamente en la base de datos.
fuente
phpMyAdmin le permite definir claves externas utilizando su vista de "relaciones". Pero como MySQL solo admite restricciones externas en las tablas "INNO DB", el primer paso es asegurarse de que las tablas que está utilizando sean 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 PADRE, puede hacer lo siguiente:
Al realizar una exportación en la tabla CHILD, debería ver que se ha creado una restricción de clave externa para la columna PID.
fuente
Este es un resumen de un artículo de Wikipedia. Especifica los diferentes tipos de relaciones que puede estipular en PHPmyadmin. Lo pongo aquí porque es relevante para el comentario de @ Nathan sobre la configuración de las opciones de claves externas para "al actualizar / eliminar", pero es demasiado grande para un comentario, espero que ayude.
CASCADA
Siempre que se eliminen las filas de la tabla maestra (referenciada) (respectivamente actualizada), las filas respectivas de la tabla secundaria (referenciada) con una columna de clave foránea coincidente también se eliminarán (respectivamente actualizadas). Esto se llama una eliminación en cascada (resp. Actualización [2]).
RESTRINGIR
Un valor no se puede actualizar o eliminar cuando existe una fila en una tabla de clave externa que hace referencia al valor en la tabla referenciada. Del mismo modo, una fila no se puede eliminar siempre que haya una referencia a ella desde una tabla de clave externa.
NO ACCION
NO ACTION y RESTRICT son muy parecidos. La principal diferencia entre SIN ACCIÓN y RESTRICCIÓN es que SIN ACCIÓN la verificación de integridad referencial se realiza después de intentar alterar la tabla. RESTRICT realiza la comprobación antes de intentar ejecutar la instrucción UPDATE o DELETE. Ambas acciones referenciales actúan de la misma manera si falla la comprobación de integridad referencial: la instrucción UPDATE o DELETE producirá un error.
SET NULL
Los valores de clave externa en la fila de referencia se establecen en NULL cuando la fila referenciada se actualiza o se elimina. Esto solo es posible si las columnas respectivas en la tabla de referencia son anulables. Debido a la semántica de NULL, una fila de referencia con NULL en las columnas de clave externa no requiere una fila referenciada.
ESTABLECER PREDETERMINADO
Al igual que SET NULL, los valores de clave externa en la fila de referencia se establecen en la columna predeterminada cuando la fila referenciada se actualiza o se elimina.
fuente
En phpmyadmin, puede asignar una clave externa simplemente por su GUI. Haga clic en la tabla y vaya a la pestaña Estructura. encuentre la Vista de relación justo debajo de la tabla (que se muestra en la imagen a continuación).
Puede asignar la clave de falsificación desde el cuadro de lista cercano a la clave principal (vea la imagen a continuación). y guardar
consulta SQL correspondiente generada y ejecutada automáticamente.
fuente
Para aquellos nuevos en la base de datos ... y necesitan ALTERAR una tabla existente. Muchas cosas parecen ser bastante sencillas, pero siempre hay algo ... entre A y B.
Antes que nada, mira esto .
Vaya a la pestaña SQL (estoy usando phpMyAdmin, debería ser similar en otros) y ejecute este comando:
Haga clic en la tabla secundaria, luego en la estructura, finalmente en la vista relacional. Termine su planificación de base de datos allí. Hubo una buena respuesta antes de esta sobre cascada, restricción, etc. Por supuesto, podría hacerse mediante comandos ...
fuente
La clave externa significa que un atributo no principal de una tabla hace referencia al atributo principal de otro * en phpMyAdmin * primero configure la columna que desea establecer como clave externa como índice
luego haga clic en VISTA DE RELACIÓN
allí puede encontrar las opciones para configurar la clave externa
fuente
InnoDB le permite agregar una nueva restricción de clave externa a una tabla utilizando ALTER TABLE:
Por otro lado, si MyISAM tiene ventajas sobre InnoDB en su contexto, ¿por qué querría crear restricciones de clave externa? Puede manejar esto en el nivel de modelo de su aplicación. ¡Solo asegúrese de que las columnas que desea usar como claves foráneas estén indexadas!
fuente
No olvide que las dos columnas deben tener el mismo tipo de datos.
por ejemplo, si una columna es de tipo INT y la otra es de tipo tinyint, obtendrá el siguiente error:
Error al crear una clave externa en [columna PID] (verifique los tipos de datos)
fuente
Paso 1: debe agregar la línea: default-storage-engine = InnoDB en la sección [mysqld] de su archivo de configuración mysql (my.cnf o my.ini dependiendo de su sistema operativo) y reiniciar el servicio mysqld.
Paso 2: Ahora, cuando cree la tabla, verá que el tipo de tabla es: InnoDB
Paso 3: crea la tabla principal y secundaria. Ahora abra la tabla secundaria y seleccione la columna U que desea tener la clave externa: seleccione la clave de índice de la etiqueta de acción como se muestra a continuación.
Paso 4: Ahora abra la Vista de relación en la misma tabla secundaria desde la parte inferior cerca de la Vista de impresión como se muestra a continuación.
Paso 5: Seleccione la columna U que desea tener la clave externa como Seleccione la columna principal en el menú desplegable. dbName.TableName.ColumnName
Seleccione los valores apropiados para ON DELETE y ON UPDATE
fuente
Primero configure Storage Engine como InnoDB
entonces la opción de vista de relación habilitada en el menú de estructura
fuente
Este es un hilo viejo pero responde porque si es útil para cualquiera.
Paso 1 . Su motor de almacenamiento Db configurado en InnoDB
Paso 2 . Crear tabla primaria
aquí
customer
está la tabla primaria ycustomer_id
es la clave primariaPaso 3 . crear tabla de clave externa y dar índice
aquí tenemos
customer_addresses
como tabla relacionada y direcciones de clientes de la tienda, así que aquícustomer_id
relación con lacustomer
tablapodemos seleccionar el índice directamente cuando creamos la tabla de la siguiente manera
Si olvidó dar índice al crear una tabla , puede dar índice desde la pestaña de estructura de la tabla como se muestra a continuación.
Paso 4 . Una vez que el índice dé al campo, vaya a la pestaña de estructura y haga clic en Vista de relación como se muestra en la imagen a continuación
Paso 5 . Ahora seleccione el botón ON DELETE y ON UPDATE lo que quiere hacer, seleccione la columna de la tabla actual, seleccione DB (DB MISMO), seleccione tabla de relación y la clave primaria de esa tabla como se muestra en pic abajo y Guardar se
Ahora verifique si las relaciones se dan con éxito, vaya a la lista de datos de la tabla externa y haga clic en el valor de la clave externa, redirigirá al registro de la tabla primaria, luego la relación se realizó con éxito.
fuente
De la documentación oficial de MySQL en https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
fuente
Las versiones más recientes de phpMyAdmin ya no tienen la opción " Vista de relación ", en cuyo caso tendrá que ejecutar una declaración para lograr lo mismo. Por ejemplo
En este ejemplo, si se elimina una fila de empresas, todos los empleados con ese ID de empresa también se eliminan.
fuente