我想在我的项目中使用级联来简化某些过程。我创建了这两个查询以及几个查询,但所有子表在执行时都会抛出相同的错误。当我使用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)
答案 0 :(得分:0)
您定义了外键
ON DELETE CASCADE
但您的branch_id
定义为NOT NULL
。那不行。
您希望branch_id
永远不会null
,但随后会删除与外键相关的数据,并希望将其设置为NULL
CASCADE
选项。
因此,要么更改,请在外键中删除ON DELETE CASCADE
或允许NULL
。这工作