在做了一些研究之后,似乎当表引擎类型不匹配时,或者外键创建因任何原因而失败时,都会发生errno 150。无论如何,我的Create脚本如下所示:
CREATE TABLE IF NOT EXISTS Users
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
fooType INT UNSIGNED NOT NULL DEFAULT 0,
...More columns, nothing special...
PRIMARY KEY (`id`),
CONSTRAINT Users_fooType_fk
FOREIGN KEY (fooType)
REFERENCES FooTypes (id)
ON DELETE CASCADE
) ENGINE = InnoDB#
CREATE TABLE IF NOT EXISTS FooTypes
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...More columns, nothing special...
PRIMARY KEY (`id`)
) ENGINE = InnoDB#
因此,我的表引擎显式和隐式匹配(我使用MySQL 5.1.49,它默认使用InnoDB AFAIK)。
所以唯一的区别是Users.fooType有一个默认值。那是问题吗?如果是,我该如何设置默认值?如果不是,任何人都会看到代码有什么问题吗?对不起,我不得不对它进行一些模糊处理,但是你必须接受我的说法,即模糊的代码块是正确的/不相关的。
答案 0 :(得分:2)
您必须在FooTypes
之前创建表Users
,因为它在FooTypes
存在之前使用FooTypes
的引用,意味着违反外键约束,即FooTypes(id)
必须在提供Users(fooType)
引用之前存在。
答案 1 :(得分:1)
REFERENCES FooTypes (id)
失败,因为找不到FooTypes
个表格,更不用说id
列。
<强>解决方案:强>
只需在FooTypes
Users
表