2010-07-18 10 views
6

¿La definición de una clave externa también define un índice? Tengo mysql v5.1.46 & Estoy mirando la herramienta de administrador de MySQL y muestra la clave externa como un índice, así que quería confirmar?Pregunta de la clave externa de MySQL

Respuesta

3

Sí, MySQL 5.1 crea automáticamente un índice en la tabla de referencia cuando define una restricción de clave externa. MySQL requiere un índice tanto en la tabla de referencia como en la tabla a la que se hace referencia para las claves externas.

Sin embargo, tenga en cuenta que el índice se crea automáticamente solo en la tabla de referencia y no en la tabla a la que se hace referencia. MySQL no permitirá crear una clave externa que hace referencia a un campo en la tabla de referencia que no puede usar un índice:

CREATE TABLE orders (
    id int PRIMARY KEY, 
    code int, 
    name varchar(10) 
) ENGINE=INNODB; 

CREATE TABLE order_details (
    detail_id int PRIMARY KEY, 
    order_code int, 
    value int, 
    FOREIGN KEY (order_code) REFERENCES orders(code) 
) ENGINE=INNODB; 

ERROR 1005 (HY000): Can't create table 'test.order_details' 

Esto no es muy común, ya que a menudo se estaría creando restricciones de claves foráneas que hacen referencia a la clave principal de la tabla a la que se hace referencia, y las claves principales se indexan automáticamente. Sin embargo, es probable que valga la pena tenerlo en cuenta.

Creación de un índice en el campo de la tabla orderscode resolvería el problema:

CREATE INDEX ix_orders_code ON orders(code); 
8
  • Si ya existe un índice utilizable (un índice en las columnas de clave externa se enumeran como las primeras columnas en el mismo orden), entonces no se crea un nuevo índice.
  • Si no hay un índice utilizable, la creación de una clave externa también crea un índice.

Esto se cubre en el documentation.

InnoDB requiere índices en claves externas y claves a las que se hace referencia para que las comprobaciones de claves externas puedan ser rápidas y no requieran una exploración de tabla. En la tabla de referencia, debe haber un índice donde las columnas de clave externa se enumeran como las primeras columnas en el mismo orden. Dicho índice se crea automáticamente en la tabla de referencia si no existe. (Esto está en contraste con algunas versiones anteriores, en las que los índices debían crearse explícitamente o la creación de restricciones de clave externa fallaría). Index_name, si se proporciona, se usa como se describió anteriormente.

+0

Corregido el enlace obsoleto a la documentación. –

Cuestiones relacionadas