¿Configurando claves foráneas en phpMyAdmin?


Estoy configurando una base de datos usando phpMyAdmin. Tengo dos tablas (foo y bar), indexados en sus claves primarias . Estoy tratando de crear una tabla relacional (foo_bar) entre ellos, usando sus claves primarias como claves foráneas.

He creado 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 elija la tabla foo_bar, haga clic en el enlace "vista de relación" e intente establecer las columnas FK para ser database.foo.id y database.bar.id, dice " Sin í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 centrarme en PHP / CSS / Javascript, y viene con phpMyAdmin.

Además, aunque todavía no he podido configurar claves foráneas explícitas, tengo una tabla relacional y puedo realizar combinaciones así:

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 FKs explícitamente definidos en la base de datos.

Author: Nathan Long, 2009-01-20

9 answers

Si quieres usar phpMyAdmin para configurar relaciones, tienes que hacer 2 cosas. En primer lugar, debe definir un índice en la columna de clave foránea en la tabla de referencia (so 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 (por lo que en su caso foo.id) y las acciones on update y on delete.

Creo que las claves foráneas son útiles si tiene varias tablas vinculadas entre sí, en particular, sus scripts de eliminación se convertirán en muy corto si configura las opciones de referencia correctamente.

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

 316
Author: rael_kid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 18:57:49

PhpMyAdmin le permite definir claves foráneas usando su vista "relations". Pero como MySQL solo admite restricciones extranjeras en 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 de modo que la columna PID en una tabla llamada HIJO haga referencia a la columna ID en una tabla llamada PADRE, puede hacer lo siguiente:

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

Al hacer una exportación en la tabla SECUNDARIA, debería ver que se ha creado una restricción de clave foránea para la columna PID.

 205
Author: awais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-26 12:10:15

Este es un resumen de un artículo de Wikipedia. Especifica los diferentes tipos de relaciones que puede estipular en phpMyAdmin. Lo estoy poniendo aquí porque es relevante para el comentario de @Nathan sobre la configuración de las opciones de claves foráneas para "on update / delete", pero es demasiado grande para un comentario - espero que ayude.

CASCADE

Siempre que se eliminen filas en la tabla maestra (referenciada) (resp. actualizado), las filas respectivas de la tabla secundaria (referencia) con un la columna clave se eliminará (resp. actualizado) también. Esto se denomina 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 foránea que hace referencia al valor en la tabla referenciada. Del mismo modo, una fila no se puede eliminar mientras haya una referencia a ella desde una tabla de claves foráneas.

NO ACTION

NO ACTION y RESTRICT son muy similares. La principal diferencia entre NO ACTUAR y RESTRINGIR es que sin NINGUNA ACCIÓN la comprobació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 foránea en la fila de referencia se establecen en NULL cuando la fila referenciada se actualiza o elimina. Esto solo es posible si las columnas respectivas de la tabla de referencia son nullables. Debido a la semántica de NULL, una fila de referencia con NULOs en las columnas de clave foránea no requiere una fila referenciada.

ESTABLECER POR DEFECTO

Similar a SET NULL, los valores de clave foránea en la fila de referencia se establecen en la columna predeterminada cuando la fila referenciada se actualiza o elimina.

 74
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-10 01:45:30

En phpmyadmin, puede asignar la clave foránea 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 (se muestra en la imagen de abajo).

introduzca la descripción de la imagen aquí

Puede asignar la clave de forja desde el list box cerca de la clave primaria.(Ver imagen abajo). y guardar

introduzca la descripción de la imagen aquí

Consulta SQL correspondiente generada y ejecutada automáticamente.

 50
Author: Nishad Up,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-10 09:28:28

Para los nuevos en la base de datos .... y la necesidad de ALTERAR una tabla existente. Muchas cosas parecen ser bastante sencillas, pero siempre hay algo ... entre A y B.

Antes que nada, echa un vistazo a esto.

  1. Asegúrese de tener P_ID (ID padre en la tabla padre e hijo).
  2. Por supuesto que ya estará rellenado en el padre. No necesariamente en el niño de una manera verdadera y final. Así por ejemplo P_ID # 3 (tal vez muchas veces en el niño tabla estará apuntando a P_ID original en la tabla padre).
  3. Vaya a la pestaña SQL (estoy usando phpMyAdmin, debería ser similar en otras) y haga este comando:

    ALTER TABLE child_table_name
    AÑADIR CLAVE FORÁNEA (P_ID)
    REFERENCIAS parent_table_name (P_ID)

  4. Haga clic en la tabla secundaria, que la estructura, finalmente en la vista relacional. Termina tu planificación de DB allí. Había una buena respuesta antes de esta sobre cascade, restrict, etc. Por supuesto que podría hacerse por comando...

 11
Author: user2060451,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-12 05:06:05

Clave foránea significa que un atributo no primo de una tabla se refiere al atributo primo de otro * en phpMyAdmin * primero establezca la columna en la que desea establecer la clave foránea como un índice

Luego haga clic en VISTA DE RELACIÓN

Allí u puede encontrar las opciones para establecer la clave foránea

 9
Author: Shafeeq M kunjumoideen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 10:56:07

InnoDB le permite agregar 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? 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!

 7
Author: markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-21 09:07:57

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 la clave foránea en [columna PID] (comprobar tipos de datos)

 4
Author: pouya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 18:08:42

Paso 1: Tienes que añadir la línea: default-storage-engine = InnoDB bajo la sección [mysqld]de su archivo de configuración de mysql (my.cnf o my.ini dependiendo de su sistema operativo) y reinicie el servicio mysqld. introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

Paso 3: Cree tanto la tabla principal como la secundaria. Ahora abra la tabla Secundaria y seleccione la columna U como para tener la Clave Foránea: Seleccione la Clave de Índice de Etiqueta de acción como se muestra a continuación.

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

introduzca la descripción de la imagen aquí Paso 5: Seleccione la columna U como para tener la clave foránea como Seleccione la columna Principal del menú desplegable. dbName.TableName.ColumnName

Seleccione los valores apropiados para ON DELETE y ON UPDATE introduzca la descripción de la imagen aquí

 2
Author: Vinod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-07 21:07:59