当我执行以下两个查询时(我已将它们剥离到绝对必要):
mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;
我收到以下错误: ERROR 1005(HY000):无法创建表'./test/bar.frm'(错误号:150)
****是我的错误?我盯着这个半小时没找到他。
答案 0 :(得分:30)
如果你重新创建一个表 掉线了,它必须有一个定义 符合外键 引用它的约束。它必须 拥有正确的列名称和类型, 它必须有索引 如前所述,引用的密钥。如果 这些都不满意,MySQL返回 错误号1005并指错误 150错误信息。
我怀疑是因为你没有创建foo
作为InnoDB,因为其他一切看起来还不错。
编辑:来自同一页面 -
两个表都必须是InnoDB表,它们不能是TEMPORARY表。
答案 1 :(得分:11)
您可以使用命令SHOW ENGINE INNODB STATUS
获取有关错误的更多具体信息。
它会为您提供包含大量文字的Status
列的结果。
查找名为LATEST FOREIGN KEY ERROR的部分,例如:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
答案 2 :(得分:4)
要创建外键,
您可以使用此命令更改表的引擎,请在执行此命令之前执行备份。
alter table [table name] ENGINE = InnoDB;
答案 3 :(得分:1)
我也有同样的问题,对于那些也有这个问题的人:
检查引用表的表名
我忘记了表格末尾的's'
例如table Client - >客户端
:)
答案 4 :(得分:1)
除了形成MySql Error 150(使用InnoDB时)的许多其他原因外,其中一个可能的原因是表的create语句中的未定义KEY
,其中包含作为外部引用的列名称关键表。
假设主表的create语句是 -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和relative_table表的create语法,其中外键约束是从主表 -
设置的 CREATE TABLE 'relative_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'salary' int(10) NOT NULL DEFAULT '',
'grade' char(2) NOT NULL DEFAULT '',
'record_id' char(10) DEFAULT NULL,
PRIMARY KEY ('id'),
CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果使用InnoDB,这个脚本肯定会以MySql Error 150结束。
要解决此问题,我们需要为KEY
表中的列record_id
添加master_table
,然后在relative_table
表中引用以用作foreign_key。
最后,master_table
的create语句将是 -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id'),
KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案 5 :(得分:0)
我遇到了同样的问题,原因是列的“整理”不同。一个是latin1而另一个是utf8
答案 6 :(得分:0)
如果您在“references”关键字后没有给出正确的列名,也可能发生这种情况。