2014-02-28 48 views
1

我正在创建一个小型数据库,以便我可以在一般情况下获得MySQL和SQL的挂起。MySQL引擎= InnoDB错误1005 errno 150

我不知道我在做什么错,但我想我会发布我的代码,以防万一这个问题是句法,我只是不捕捉。

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以及我应该如何使用最简单的条件修复它?

+0

“部门”中的哪一栏是引用的?它是否具有与“ID”相同的数据类型? – markg

+0

您的外键更改引用部门(id) –

回答

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 ......同样,你不得不说,这在其他表

引用了什么样的列
+0

因此,始终包含父表的引擎= InnoDB以及引用它的子表是否被认为是良好的做法? – Christina

+0

因为MyIsam根本不支持外键约束,所以在MyIsam上使用InnoDB总是一个好习惯...... –

+0

如果我需要全文索引,我只使用myisam,我使用的版本不支持全文索引在innodb上(不知道它是否真的支持)。 INNODB是支持事务型数据库的最佳选择 – markg

1

从MySQL文档:

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应同时指定refferenced表,表内的referrenced行:

例如:

参考部门(ID)

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

0

我刚刚有这个问题。我的解决方案是确保我所引用字段的整数类型都是UNSIGNED。如果一个是SIGNED,另一个是UNSIGNED,你会得到这个错误。

如果你想要负数,那么只要确保两者都有SIGNED,但最有可能你会想UNSIGNED。点是他们需要是相同的类型。

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

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

+0

嗯,这很有趣,我一定会记住它。我在这里遇到的问题实际上是通过根据MySQL语法正确编写外键来解决的:FOREIGN KEY(attribute)REFERENCES table_name(attribute)'' – Christina

相关问题