我需要双眼才能知道为什么我无法创建以下外键。
ALTER TABLE `DEFAULTS_OPTIONS`
ADD CONSTRAINT `DEFAULTS_OPTIONS_ibfk_1` FOREIGN KEY (`univers_code`) REFERENCES `UNIVERSES` (`code`) ON DELETE CASCADE ON UPDATE CASCADE;
以下是对involucrated表的描述:
CREATE TABLE `DEFAULTS_OPTIONS` (
`country_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`univers_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`element_code` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
`option_code` varchar(8) COLLATE utf8_unicode_ci NOT NULL,
`element_category` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`country_code`,`univers_code`,`element_code`,`option_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `UNIVERSES` (
`country_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`order` tinyint(4) NOT NULL,
PRIMARY KEY (`country_code`,`code`),
CONSTRAINT `UNIVERSES_ibfk_1` FOREIGN KEY (`country_code`) REFERENCES `COUNTRY` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这是我得到的错误:
Error Code: 1005. Can't create table 'DEV_DEV.#sql-aa2_2e1' (errno: 150)
有人看到我的错误吗?
先谢谢你一起来看看。
修改
Naktibalda建议我检查一下
的结果SHOW ENGINE INNODB STATUS
帮助弄清楚原因。
答案 0 :(得分:1)
它失败了,因为您没有UNIVERSES.code字段的索引, 你的PRIMARY KEY不好用,因为代码不是PK中的第一个字段。
如果您想参考2个字段的组合, 使用
ALTER TABLE `DEFAULTS_OPTIONS`
ADD CONSTRAINT `DEFAULTS_OPTIONS_ibfk_1` FOREIGN KEY (`country_code`, `univers_code`) REFERENCES `UNIVERSES` (`country_code`, `code`) ON DELETE CASCADE ON UPDATE CASCADE;
答案 1 :(得分:1)
要定义简单的,未组合的外键,还必须为父列编制索引。
似乎UNIVERSES.code
列没有编入索引。
更改如下:
ALTER TABLE UNIVERSES ADD KEY ( code );
现在,您可以在DEFAULTS_OPTIONS
列的UNIVERSES.code
表格中添加外键。