MySQL引擎= InnoDB错误1005 errno 150

时间:2014-02-28 19:34:00

标签: mysql foreign-keys innodb

我正在创建一个小型数据库,这样我就可以掌握MySQL和SQL。

我不确定我做错了什么,但我想我会发布我的代码,以防问题是语法上的问题,我只是没有抓到。

CREATE TABLE student(
       ID varchar(5) NOT NULL, 
       name varchar(20) NOT NULL, 
       dept_name varchar(20), 
       tot_cred numeric(3,0), 
  PRIMARY KEY(ID), 
  FOREIGN KEY(dept_name) 
    REFERENCES department 
  ON UPDATE CASCADE 
  ON DELETE CASCADE) 
ENGINE = InnoDB;

我已经创建了包含dept_name主键的'department'表。我在使用外键约束时尝试继续使用ENGINE = InnoDB,但显然不成功。

有人可以向我解释为什么MySQL会给我一个错误1005 errno 150以及我应该如何使用最简单的术语修复它?

3 个答案:

答案 0 :(得分:1)

来自mysql docs:

1005 (ER_CANT_CREATE_TABLE)

Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.

使用REFERENCES时,您应该同时指定引用表和表中的引用行:

示例:

REFERENCES部门(id)

此外,出于性能原因,建议使用数值作为外键。

答案 1 :(得分:1)

确保您遵守此语法...

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT, 
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) 
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;

确保您的数据类型在fk上相同...并且您必须说明其中的哪个列在另一个表中引用

答案 2 :(得分:0)

我刚遇到这个问题。我的解决方案是确保我引用的字段的整数类型都是 UNSIGNED 。如果一个签名而另一个签名,则会收到此错误。

如果你想要负数,那么只要确保两者都是签名,但很可能你会想要UNSIGNED。要点是它们必须是同一类型。

因此,如果您在另一个表中引用主键,请确保主键是UNSIGNED整数类型。

然后,当您创建外键时,请确保您创建它的列也是UNSIGNED Integer类型。