无法创建表(错误号:150)

时间:2013-03-02 14:07:21

标签: mysql sql

我试图在MySQL中创建一个表:

CREATE TABLE band ( 
    id int NOT NULL AUTO_INCREMENT, 
    name varchar(255) NOT NULL ,
    frontman int NOT NULL ,   
    PRIMARY KEY(id), 
    FOREIGN KEY(frontman) references person(id)  
)  

新表将具有此表的外键:

CREATE TABLE person (
    id int NOT NULL AUTO_INCREMENT,
    nick varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    admin boolean,
    PRIMARY KEY(id)
)

,错误是:

#1005 - Can't create table 'apptestdb.band' (errno: 150)

任何想法都错了吗?谢谢。

3 个答案:

答案 0 :(得分:0)

我是从stackoverflow网站Error 150获得的,请参阅它可以帮助您解决问题。

错误代码:1005 - 代码中的主键引用错误

通常是由于参考FK字段不存在。可能是你有错字错误,或检查案例应该是相同的,或者是字段类型不匹配。 FK链接的字段必须与定义完全匹配。

一些已知原因可能是:

两个关键字段类型和/或大小不完全匹配。例如,如果一个是INT(10),则关键字段也需要是INT(10)而不是INT(11)或TINYINT。您可能希望使用SHOW CREATE TABLE确认字段大小,因为查询浏览器有时会直观地显示INT(1)和INT(11)的INTEGER。您还应检查一个是否已签名而另一个是否为UNSIGNED。它们都需要完全相同。 您尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。 外键名称是已存在键的副本。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加一些随机字符即可对其进行测试。 您的一个或两个表是MyISAM表。为了使用外键,表必须都是InnoDB。 (实际上,如果两个表都是MyISAM,那么您将不会收到错误消息 - 它只是不会创建密钥。)在查询浏览器中,您可以指定表类型。 您已指定级联ON DELETE SET NULL,但相关键字段设置为NOT NULL。您可以通过更改级联或将字段设置为允许NULL值来解决此问题。

确保Charset和Collat​​e选项在表级别以及关键列的单个字段级别都相同。

您的外键列

上有默认值(即默认值= 0)

关系中的一个字段是组合(复合)键的一部分,并且没有它自己的单独索引。即使字段将索引作为组合键的一部分,您也必须仅为该键字段创建单独的索引,以便在约束中使用它。

您的ALTER语句中存在语法错误,或者您在关系中输错了其中一个字段名称

10外键的名称超过64个字符的最大长度。

答案 1 :(得分:0)

您正在为另一个表person制作外键,以便更好地分享此表。

IF 您只想创建此表band,然后删除FOREIGN KEY,它就能正常运行。

看这里DEMO。你的桌子工作正常。

EDIT。这里是person

的工作表
 create table  person (
  id  int NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY(id))
  ;

 CREATE TABLE band ( 
 id int NOT NULL , 
 name varchar(255) NOT NULL ,
 frontman int NOT NULL ,   

 FOREIGN KEY(frontman) references person(id)
 ); 

working table demo

答案 2 :(得分:0)

我终于找到了解决方案。很简单。每个CREATE TABLE命令必须是分号后才能结束命令。我运行它的方式尝试使用下一个CREATE TABLE命令作为第一个命令的参数。