MySQL:errno(150),无法创建表(与外键相关)

时间:2013-06-20 12:57:08

标签: php mysql foreign-keys

我想在我的项目中使用级联来简化某些过程。我创建了这两个查询以及几个查询,但所有子表在执行时都会抛出相同的错误。当我使用MyISAM作为引擎时,它们工作,但在进一步的测试和研究中,我认为它不支持级联,所以我将引擎切换到InnoDB,这触发了这些错误。我看了几个论坛和线程有同样的问题,但我似乎无法弄清楚实际问题在哪里。有人可以帮忙吗?

ParentTable:

CREATE TABLE IF NOT EXISTS `branches` ( `branch_id` int(11) NOT NULL AUTO_INCREMENT, `key` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `short_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `city` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `timezone` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, UNIQUE(`key`), PRIMARY KEY (`branch_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

子表:

CREATE TABLE IF NOT EXISTS `files` ( `file_id` int(11) NOT NULL AUTO_INCREMENT, `branch_id` int(11) NOT NULL, `path` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `use_google_analytics` BOOLEAN NOT NULL, FOREIGN KEY(`branch_id`) REFERENCES `branches`(`branch_id`) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY (`file_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

错误:

1005: Can't create table 'files' (errno: 150)

1 个答案:

答案 0 :(得分:0)

您定义了外键

ON DELETE CASCADE 

但您的branch_id定义为NOT NULL。那不行。

您希望branch_id永远不会null,但随后会删除与外键相关的数据,并希望将其设置为NULL CASCADE选项。

因此,要么更改,请在外键中删除ON DELETE CASCADE或允许NULL。这工作

SQLFiddle demo