2009-05-05 12 views
16

Cuando ejecuto el seguimiento dos consultas (los he despojado a absolutamente necesario):MySQL Error 150 - Las claves externas

mysql> CREATE TABLE foo(id INT PRIMARY KEY); 
Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE bar (id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB; 

me sale el siguiente error: ERROR 1005 (HY000): No se puede create table './test/bar.frm' (errno: 150)

¿Dónde **** está mi error? No lo he encontrado mientras lo veo durante media hora.

Respuesta

29

De FOREIGN KEY Constraints

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Mi sospecha es que es porque no creó foo como InnoDB, como todo lo demás se ve bien.

Editar: desde la misma página -

Both tables must be InnoDB tables and they must not be TEMPORARY tables.

+0

Un poco de prueba rápida, creando un 'foo' como el anterior con MyISAM, y una' barra' con InnoDB, sugiere que ese sea el caso - intente verificar dos veces su tipo de tabla para 'foo'. – Rob

+0

+1 para "Ambas tablas deben ser tablas InnoDB", ¡muchas gracias! – sanbhat

+1

Incluso cuando ambas tablas eran InnoDB, todavía tenía el mismo problema. Lo arreglé por el índice creado en la tabla referida antes de crear la clave externa. – IROEGBU

1

que tenía el mismo problema, por aquellos que están teniendo esto también:

verificación del nombre de la tabla de la tabla referenciada

que tenía olvidé la 's' al final de mi nombre de tabla

por ejemplo, tabla Cliente -> Clientes

:)

0

Tuve el mismo problema y el motivo fue que la "recopilación" de columnas era diferente. Uno de ellos era latin1 mientras que el otro era utf8

9

Puede utilizar el comando SHOW ENGINE INNODB STATUS

+0

¡Gracias! Guardado mi día –

+0

¡De acuerdo! Muestra una sección "Último error de clave externa", que en mi caso me indicó que no se encontró el nombre del campo de destino de una restricción de clave externa. Esto es más útil que un simple "Error 150" ;-) –

+0

En mi caso había olvidado establecer la columna para permitir NULL, y poner SET NULL en la restricción. Pero solo encontré el motivo ejecutando 'SHOW ENGINE INNODB STATUS' –

1

Aparte forman muchas otras razones para terminar con MySQL Error 150 (durante el uso de InnoDB), uno de la razón probable, es el indefinido KEY en la sentencia create de la tabla que contiene el nombre de la columna a la que se hace referencia como clave foránea en la tabla relativa.

Digamos que la declaración de tabla maestra crear es -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

y la creación de sintaxis para la tabla relative_table donde la restricción de clave externa se establece a partir de la tabla primaria -

CREATE TABLE 'relative_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'salary' int(10) NOT NULL DEFAULT '',
 'grade' char(2) NOT NULL DEFAULT '',
 'record_id' char(10) DEFAULT NULL,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Este script definitivamente terminará con MySql Error 150 si usa InnoDB.

Para solucionar esto, tenemos que añadir una KEY para la La columna record_id en la tabla master_table y luego hacer referencia en la tabla relative_table para ser utilizado como un foreign_key.

Por último, la sentencia de creación de la master_table, será -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4

Para crear una clave externa,

  1. tanto la columna principal y la columna de referencia deben tener la misma definición.
  2. Ambos motores de tablas deben ser InnoDB.

Puede modificar el motor de la tabla con este comando, realice la copia de seguridad antes de ejecutar este comando.

alter table [nombre de la tabla] ENGINE = InnoDB;

+2

" debe tener la misma definición "era la misma codificación de conjunto de caracteres para mí – gengisdave

+0

" debe tener la misma definición "era las mismas banderas de la misma columna para mí: la clave primaria existente a la que hacía referencia NO ESTUVIERON FIRMADOS, así que tuve que hacer la columna de mi nueva tabla que también fuera clave extranjera en el primer – cellepo

0

Esto también puede ocurrir si no ha dado el nombre de columna correcto después de la palabra clave "referencias".

Cuestiones relacionadas