2012-02-21 94 views
1

经过一番研究,似乎在任何表引擎类型不匹配时或者因任何原因导致外键失败时都会发生errno 150。总之,我创建的脚本是这样的:SQLException:无法创建表errno 150 /外键

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 49年1月5日,在默认情况下AFAIK使用InnoDB的)。

所以唯一的区别是Users.fooType有一个默认值。这是问题吗?如果是,我该如何设置默认值?如果不是,有人看到代码有什么问题吗?对不起,我不得不稍微混淆它,但是你必须承认,代码的混淆块是正确的/不相关的。

回答

2

你必须Users之前创建表FooTypes,因为它使用参考FooTypesFooTypes甚至还存在之前,是指违反外键约束,也就是FooTypes(id)必须提供Users(fooType)其参考之前存在。

+0

刚刚创建FooTypes表*捂脸*是的,这会做到这一点,是不是呢?谢谢! – 2012-02-21 21:35:15

1

REFERENCES FooTypes (id)失败为否FooTypes找到表,更不用说id列。

解决方案:
Users

相关问题