2011-04-22 16 views
13

que utiliza MySQL Workbench para agregar una clave externa en una tabla, pero ocurrió algún error extraño, esta es la instrucción SQL:no se puede agregar una clave externa en mysql?

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId` 
     FOREIGN KEY (`goodsId`) 
     REFERENCES `tansung`.`Goods` (`goodsId`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
    , ADD INDEX `goodsId` (`goodsId` ASC) ; 

Cuando hago clic en aplicar, la sorpresa sale!

ERROR 1005: Can't create table 'tansung.#sql-1b10_1' (errno: 150) 

SQL Statement: 

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId` 
     FOREIGN KEY (`goodsId`) 
     REFERENCES `tansung`.`Goods` (`goodsId`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
    , ADD INDEX `goodsId` (`goodsId` ASC) 


ERROR: Error when running failback script. Details follow. 


ERROR 1050: Table 'Declaration' already exists 

SQL Statement: 

CREATE TABLE `Declaration` (
    `declarationId` int(11) NOT NULL, 
    PRIMARY KEY (`declarationId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

No puedo encontrar ningún error en la lógica, incluso no puedo entender el error, por favor ayúdenme.

+1

el error parece bastante autoexplicativo; Está intentando crear una tabla llamada 'Declaración' que ya existe ... –

+0

Asegúrese de no estar ejecutando todo el código SQL en una ventana. Parece que está ejecutando el código ALTER TABLE seguido inmediatamente por el código CREATE TABLE ... asegúrese de que solo está ejecutando el código ALTER TABLE para evitar ese error. – acconrad

+0

@Brian Driscoll el error real viene en la parte superior del bloque de código 'ERROR 1005: No se puede crear la tabla 'tansung. # Sql-1b10_1' (errno: 150)' –

Respuesta

0

Las definiciones de los tipos Goods.goodsId y Declarations.goodsId deben ser idénticas, o obtendrás el errno: 150.

Asegúrese de que ambos sean del mismo tipo de datos, que parece ser goodsId INT(11) NOT NULL en la tabla Declarations. ¿Cuál es la declaración CREATE TABLE para Goods?

+0

puede tener algunas relaciones con eso configuro "low_case_table_names = 0" – firefly

+0

porque necesito ORM para generar la clase de entidad, entonces quiero usar upper_case, pero mysql en windows solo toma el nombre de la tabla lower_case, entonces configuro low_case_table_names = 0, pero eso puede tener algunos problemas cuando agrego una clave foránea. – firefly

5

Recibo este error cuando la tabla que está siendo vinculada a (en su caso, Mercancías) se almacena utilizando MyISAM, y la tabla a la que agrega el índice (en su caso, Declaraciones) se almacena utilizando InnoDB.

Puede ver esto a partir de los archivos en el directorio de la base de datos. tablas MyISAM tendrán archivos como:

table_name.frm 
table_name.MYD 
table_name.MYI 

La tabla InnoDB sólo tendrá:

table_name.frm 

MyISAM no soporta claves foráneas. Yo sugeriría la conversión de su mesa de mercancías a InnoDB (sin embargo, echar un vistazo a la documentación de primera y hacer algo de basic research):

ALTER TABLE Goods ENGINE=INNODB; 

Después de hacer este cambio, mi operación ADD ÍNDICE completada con éxito.

+1

¡Ese fue el problema, gracias! – DerShodan

+0

Resolvió mi problema, ¡gracias! –

16

Todos los nombres de claves foráneas en toda la base de datos deben ser exclusivos. Si ya tiene una clave externa llamada 'goodsId', incluso en otra tabla, recibirá este error.

Si las columnas relacionadas no tienen exactamente el mismo tipo (por ejemplo, INT) y restricciones (UNIQUE y tal), recibirá ese error.

+0

Esta solución funcionó para mí. muchas gracias –

0

Tuve el mismo problema. Parece que había algunos datos en la tabla secundaria que no estaban presentes en la tabla primaria. Usted puede hacer una combinación externa para ver las diferencias y se puede asignar una identificación válida para las filas no coincidentes o eliminarlos:

DELETE FROM books 
WHERE NOT EXISTS (
    SELECT * FROM users 
    WHERE books.user_id = users.id 
) 
0

Cuando llegué que el error era becuase yo estaba tratando de actualizar una tabla que ya tenía datos int y los datos no cumplían con el FK restrictions.

0

Errno 150 tiene muchas causas. Si tiene privilegios de super, debería intentar usar

MOSTRAR INNODB ESTADO

y que le dirá cuál fue la causa. Si no tiene SUPER privilegios, solo tiene que pasar por todas las causas posibles.Puede encontrar cómo utilizar el estado muestran INNODB y una lista de todas las causas aquí:

MySQL Foreign Key Errors and Errno 150

1

Al igual que los otros han dicho, primero asegúrese de que los tipos de las dos columnas son los mismos y los soportes de base de datos eso. Después de eso, asegúrese de que las columnas que contienen las claves de las otras tablas sean válidas. Tuve un problema al agregar la restricción a una columna existente con datos, y esos datos no coincidían con ninguna de las claves principales en la otra tabla, por lo que el intento de crear la relación fallaría. Repararlo implicaba actualizar todas las columnas para asegurarme de que los datos de mi columna coincidieran con la restricción que estaba tratando de hacer.

10

Puede suceder por muchas razones. Las siguientes son algunas de las razones comunes. También puede decir errores sintácticos, por los cuales se arrojan estos tipos de error.

  1. Si el motor tabla FK (clave externa) está usando MyISAM y PK (clave principal) del motor de tablas utiliza InnoDB. MyISAM no admite restricciones de clave externa. Por lo tanto, es posible que desee convertir su tabla de enlaces a InnoDB.

  2. Todos los nombres de claves foráneas en toda la base de datos deben ser exclusivos. Si ya tiene una restricción de clave externa con el mismo nombre, incluso en otra tabla, recibirá este error.

  3. Si las columnas relacionadas no tienen exactamente el mismo tipo de datos (por ejemplo, INT) y restricciones (UNIQUE y tal), recibirá ese error.

+0

gracias No sabía que Todos los nombres de las claves externas en toda la base de datos deben ser únicos – vinay

+0

Usted es bienvenido @Vinay. Me alegro de que la respuesta te haya ayudado. – abhijitcaps

+0

Los motores de mesa no coincidentes fueron los culpables para mí. Gracias. –

0

Un cuarto problema posible (para los tres propuestos por abhijitcaps) es que usted no hizo la columna está haciendo referencia a una clave principal.

1

Descubrí que cuando intentaba hacer esto en phpMyAdmin, las tablas que tenían un guión en el nombre solo permitían un FK y luego daban errores. No tengo idea de por qué, pero fue bastante fácil de solucionar. Simplemente rehice el

CREATE TABLE `something_new` LIKE `something-old`; 
DROP TABLE `something-old`; 

YMMV.

Cuestiones relacionadas