0

我试图在 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)

有什么想法有什么问题吗?谢谢你。

4

3 回答 3

0

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

于 2013-03-02T18:11:00.637 回答
0

我从 stackoverflow 站点 Error 150得到这个,请参考它可能会帮助您解决问题。

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

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

一些已知的原因可能是:

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

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

您的外键列上有一个默认值(即 default=0)

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

您的 ALTER 语句中有语法错误,或者您在关系中输入了错误的字段名称之一

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

于 2013-03-02T14:17:32.253 回答
0

您正在将 FOREIGN KEY 设置为另一个表person,因此最好也共享此表。

如果您只想创建此表band然后删除FOREIGN KEY它会正常工作。

看这里演示。你的桌子工作得很好。

编辑。在这里你的工作桌和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)
 ); 

工作台演示

于 2013-03-02T15:11:18.633 回答