Pregunta

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 externas.

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 campos id son INT (11) .

Cuando elijo la tabla foo_bar , haga clic en la " vista de relación " e intente configurar las columnas FK para que sean database.foo.id y database.bar.id , dice " ¡No se ha definido ningún índice! " 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.

¿Fue útil?

Solución

Si desea usar phpMyAdmin para establecer relaciones, debe hacer 2 cosas. En primer lugar, debe definir un índice en la columna de clave externa en la tabla de referencia (por lo tanto, foo_bar.foo_id, en su caso). Luego, vaya a la vista de 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 externas son útiles si tiene varias tablas vinculadas entre sí, en particular, sus scripts de eliminación serán muy cortos si configura las opciones de referencia correctamente.

EDITAR: asegúrese de que ambas tablas tengan seleccionado el motor InnoDB.

Otros consejos

phpMyAdmin le permite definir claves externas utilizando sus "relaciones" ver. Pero desde entonces, MySQL solo admite restricciones externas en " INNO DB " tablas, 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:

  1. Para ambas tablas, vaya a la pestaña de operaciones y cambie su tipo a " INNO DB "
  2. Asegúrese de que ID sea la clave principal (o al menos una columna indexada) de la tabla PADRE.
  3. En la tabla CHILD, defina un índice para la columna PID.
  4. Mientras visualiza la pestaña de estructura de la tabla NIÑO, haga clic en la vista de relación " enlace justo encima de " agregar campos " sección.
  5. Se le dará una tabla donde cada fila corresponde a una columna indexada en su tabla CLIENTE. El primer menú desplegable de cada fila le permite elegir qué TABLA- > COLUMNA las referencias de columna indexadas. En la fila de PID, elija PARENT- > ID del menú desplegable y haga clic en IR.

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.

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 " en 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 externa coincidente también se eliminarán (respectivamente actualizadas). Esto se denomina eliminación en cascada (resp. Actualización [2]).

RESTRICT

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 claves foráneas.

SIN ACCIÓN

NO ACTION y RESTRICT son muy parecidos. La principal diferencia entre NO ACTION y RESTRICT es que con NO ACTION 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 verificación de integridad referencial: la instrucción UPDATE o DELETE generará 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.

SET DEFAULT

Similar a 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 elimina.

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).

 ingrese la descripción de la imagen aquí

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

 ingrese la descripción de la imagen aquí

consulta SQL correspondiente generada y ejecutada automáticamente.

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, eche un vistazo a esto .

  1. Asegúrese de tener P_ID (ID principal en la tabla principal y secundaria).
  2. Por supuesto, ya estará lleno en el padre. No necesariamente en el niño de una manera verdadera y final. Entonces, por ejemplo, P_ID # 3 (tal vez muchas veces en la tabla secundaria apuntará a P_ID original en la tabla principal).
  3. Vaya a la pestaña SQL (estoy usando phpMyAdmin, debería ser similar en otros) y ejecute este comando:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. 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 ...

Clave externa significa que un atributo no principal de una tabla hace referencia al atributo principal de otra * 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

InnoDB le permite agregar una nueva restricción de clave externa 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 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!

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] (verificar los tipos de datos)

Paso 1: Tienes que 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 según su sistema operativo) y reinicie el servicio mysqld. ingrese la descripción de la imagen aquí

Paso 2: Ahora, cuando cree la tabla, verá que el tipo de tabla es: InnoDB

 ingrese la descripción de la imagen aquí

Paso 3: Crear tanto la tabla principal como la 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.

 ingrese la descripción de la imagen aquí

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.

 ingrese la descripción de la imagen aquí 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 ingrese la descripción de la imagen aquí

De la documentación oficial de MySQL en https : //dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

  

MySQL requiere índices en claves externas y claves referenciadas para que   Las comprobaciones de clave externa pueden ser rápidas y no requieren un escaneo de tabla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top