ver relacionar llaves llave indice hacer foraneas foranea externa error encontrado crear como columnas claves clave asignar mysql phpmyadmin

relacionar - llaves foraneas mysql workbench



Configurando claves foráneas en phpMyAdmin? (9)

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

Creé estas tablas como MyISAM, pero desde entonces cambié las tres a InnoDB, porque leí que MyISAM no admite claves externas. Todos los campos de id son INT(11) .

Cuando elijo la tabla foo_bar , haga clic en el enlace "relación de relación" e intente establecer que las columnas FK sean database.foo.id y database.bar.id , que diga "¡No hay un í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 para que me centre en 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 los FK explícitamente definidos en la base de datos.


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 relaciones en el cuadro de abajo (que se muestra en la imagen de abajo).

Puede asignar la clave de forjado del cuadro de lista cerca de la clave principal (vea la imagen a continuación). y guarda

Consulta SQL correspondiente automáticamente generada y ejecutada.


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 "actualizar / eliminar" pero es demasiado grande para un comentario, espero que ayude.

CASCADA

Siempre que se eliminen las filas de la tabla maestra (referenciada) (resp. Actualizadas), las filas respectivas de la tabla secundaria (referenciada) con una columna de clave externa coincidente también se eliminarán (resp. Actualizada) también. Esto se denomina eliminación en cascada (actualización [2]).

RESTRINGIR

Un valor no se puede actualizar ni eliminar cuando existe una fila en una tabla de clave externa que hace referencia al valor en la tabla a la que se hace referencia. Del mismo modo, una fila no se puede eliminar siempre que haya una referencia a ella desde una tabla de clave externa.

SIN ACCION

SIN ACCIÓN y RESTRINGIR 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 modificar 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 resultará en 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 de referencia.

ESTABLECER PREDETERMINADO

Al igual que en SET NULL, los valores de clave foránea en la fila de referencia se establecen en el valor predeterminado de la columna cuando la fila de referencia se actualiza o se elimina.


InnoDB le permite agregar una nueva restricción de clave foránea a una tabla usando 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 externas 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 la clave externa en [columna PID] (verifique los tipos de datos)


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

  1. Asegúrese de tener P_ID (ID principal en la tabla principal y secundaria).
  2. Por supuesto que ya estará rellenado en el padre. No necesariamente en el niño de una manera verdadera y definitiva. Entonces, por ejemplo, P_ID # 3 (quizás muchas veces en la tabla secundaria estarán apuntando a P_ID original en la tabla principal).
  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 LLAVE EXTRANJERA (P_ID)
    REFERENCIAS parent_table_name (P_ID)

  4. Haga clic en la tabla secundaria, que en la estructura, finalmente en la vista relacional. Termine su planificación DB allí. Hubo una buena respuesta antes de esta acerca de la cascada, la restricción, etc. Por supuesto, podría hacerse mediante comandos ...


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 según su sistema operativo) y reiniciar el servicio mysqld.

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

Paso 3: Crea la tabla principal y la secundaria. Ahora abra la tabla secundaria y seleccione la columna U como para 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 como para tener la clave externa como Seleccionar la columna principal en el menú desplegable. dbName.TableName.ColumnName

Seleccione los valores apropiados para ON DELETE y ON UPDATE


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.


phpMyAdmin te permite definir claves foráneas usando 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 externa de modo que la columna PID en una tabla llamada NIÑO 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 NIÑO, 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 en cada fila le permite elegir a qué TABLA-> COLUMNA hace referencia la columna indexada. En la fila para PID, elija PADRE-> ID en el 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.


Clave externa significa que un atributo no primario de una tabla hace referencia al atributo principal de otra * en phpMyAdmin * primero establezca la columna en la que desea establecer la clave externa como un índice

luego haga clic en RELACIÓN VISTA

Allí puedes encontrar las opciones para establecer una clave externa.