¿Configurando claves foráneas en phpMyAdmin?

336

Estoy configurando una base de datos usando phpMyAdmin. Tengo dos tablas ( fooy 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 idcampos son INT(11).

Cuando elijo la foo_bartabla, hago clic en el enlace "vista de relación" e intento configurar las columnas FK para que aparezcan database.foo.idy database.bar.iddice "¡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.

Nathan Long
fuente

Respuestas:

366

Si desea utilizar 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.

rael_kid
fuente
93
Consejo: La vista de relaciones es un pequeño enlace debajo de su mesa, fue difícil para mí encontrarla en primer lugar
Mladen Janjetovic
14
A menos que ese enlace no se muestre allí, en cuyo caso: asegúrese de que su tabla sea del tipo InnoDB (en la pestaña Operaciones en phpMyAdmin) para que esto no suceda.
muttley91
44
@ muttley91 Mi tabla es InnoDB. Lo comprobé dos veces. El enlace aún no aparece.
afilina
66
@afilina En la nueva versión de phpMyAdmin, es visible en la parte superior dentro de la pestaña "Estructura", justo debajo de la fila de la pestaña que muestra "Examinar", "Estructura", etc.
Astitva Srivastava
226

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:

  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 PARENT.
  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 el enlace "vista de relación" justo arriba de la sección "agregar campos".
  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 hace referencia a las columnas indexadas. En la fila de PID, elija PADRE-> 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.

Wais
fuente
2
Wow, es muy importante saberlo. Esta página no fue lo primero que encontré al buscar ayuda para agregar una clave externa, ojalá se mencionara con más frecuencia.
user1299656
87

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.

Brett
fuente
1
Mejor aún, ir directamente a la fuente de documentación de MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
63

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.

Nishad Up
fuente
17

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 .

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

usuario2060451
fuente
9

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

Shafeeq M kunjumoideen
fuente
7

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!

Markus
fuente
44
Las restricciones de claves externas me ahorran mucho esfuerzo y posibles errores. Por ejemplo, supongamos que voy a eliminar un usuario de mi sistema. Podría escribir código que especifique cada lugar de la base de datos donde existan datos sobre ese usuario y decirle que lo elimine. Pero tengo que mantener esa función de eliminación actualizada en todo momento. Por otro lado, si todos los datos relacionados con el usuario tienen un FK en la ID del usuario y se configura en cascada al eliminar, todo lo que mi código tiene que decir es "eliminar a este usuario" y la base de datos se encargará de eliminar todo lo que tenga una referencia de FK a ese usuario. Mucho más limpio para mantener.
Nathan Long el
1
@Nathan: Eso es lo que digo en la publicación. También puede manejar eso en el nivel del modelo. Puede implementar al eliminar una cascada del modelo.
markus
3
Casi siempre agrega integridad referencial a las tablas de su base de datos. La base de datos debe protegerse de la mala programación de la aplicación. No confíe solo en su aplicación para mantener la integridad de los datos. Por supuesto, siempre hay excepciones para cada regla, pero no he encontrado una para esto.
Harv
4

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)

pouya
fuente
3

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

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í

Vinod
fuente
2

Primero configure Storage Engine como InnoDB

Primero configure Storage Engine como InnoDB

entonces la opción de vista de relación habilitada en el menú de estructura

entonces la opción de vista de relación habilita

Sahil Ralkar
fuente
su primer paso es correcto, pero ¿qué pasa con el siguiente? Escriba todo el proceso paso a paso.
kunal shaktawat
2

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í customerestá la tabla primaria y customer_ides la clave primaria

ingrese la descripción de la imagen aquí

Paso 3 . crear tabla de clave externa y dar índice

aquí tenemos customer_addressescomo tabla relacionada y direcciones de clientes de la tienda, así que aquí customer_idrelación con la customertabla

podemos seleccionar el índice directamente cuando creamos la tabla de la siguiente manera

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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.

Devsi Odedra
fuente
0

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

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

En este ejemplo, si se elimina una fila de empresas, todos los empleados con ese ID de empresa también se eliminan.

Vincent
fuente