MySQL无法添加外键#1215。

6

我已经在Stack Overflow上阅读了很多关于这个错误的答案,但是没有一个答案似乎能够帮助我解决问题。

我遇到的错误是:

#1215 - Cannot add foreign key constraint 

当我执行 show engine innodb status 命令时,返回如下信息:

无法在引用的表中找到索引,其中引用列出现为第一列,或者表格和引用表格中的列类型不匹配。请注意,ENUM 和 SET 的内部存储类型在使用 >= InnoDB-4.1.12 创建的表中已更改,在旧表中的这些列不能被新表中的这些列引用。

以下是涉及到的表(我正在创建一份脚本,并且错误发生在 SQL 执行期间)。
CREATE TABLE IF NOT EXISTS customer_type (
    customer_type_id int(11) unsigned NOT NULL AUTO_INCREMENT,
    `type` varchar(128) NOT NULL,
    sort int(11) NOT NULL,
    is_active tinyint(1) NOT NULL DEFAULT '1',
    PRIMARY KEY (customer_type_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS location (
    location_id int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(200) NOT NULL,
    email varchar(255) DEFAULT NULL,
    phone varchar(32) DEFAULT NULL,
    address varchar(128) DEFAULT NULL,
    city varchar(255) DEFAULT NULL,
    postal_code varchar(10) DEFAULT NULL,
    shipping_cost float unsigned DEFAULT NULL,
    is_active tinyint(1) NOT NULL DEFAULT '1',
    PRIMARY KEY (location_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS customer_type_location (
    customer_type_id int(11) unsigned NOT NULL,
    location_id int(11) unsigned NOT NULL,
    PRIMARY KEY (customer_type_id,location_id),
    FOREIGN KEY (customer_type_id)
        REFERENCES customer_type(customer_type_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (location_id)
        REFERENCES location(location_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我不理解的是为什么它说我需要在引用列上创建索引,因为您可以清楚地看到引用列是主键,应该自动创建索引。 所以错误对我来说似乎没有意义。

我尝试了大部分来自这个问题答案的建议,但都没有帮助。

过去我一直使用PostgreSQL,所以不太熟悉大多数MySQL错误,但这个项目要求我使用MySQL。 任何帮助将不胜感激。


创建一个新的数据库。在其中运行它。在我的系统上可以工作。 - Drew
show variables where variable_name in ('innodb_version','version_comment') 是什么意思? - Drew
1
我正在使用一个新创建的数据库,但看起来在我创建数据库时,排序规则被设置为 utf8_general_ci,所以我将其删除并使用排序规则 utf8_unicode_ci 创建了数据库,这似乎解决了问题。因此,数据库排序规则需要与表格排序规则匹配,这似乎不是很清楚。谢谢! - Sehael
也许你可以像上面所说的那样回答自己的问题,我们会对此表示赞赏。 - Drew
1
谢谢,很高兴知道它对你有用。这基本上缩小了问题范围,说明是我创建数据库的方式有问题。 - Sehael
1个回答

8
原来问题出在数据库排序规则上。我的数据库排序规则设置为utf8_general_ci,但它并不能正常工作。我删除了数据库,并使用utf8_unicode_ci创建了新的数据库,然后它就按预期工作了。因此,数据库排序规则和表排序规则应该匹配。
从标题为“使用外键约束”的手册页面中摘录如下:
MySQL要求对外键和引用键进行索引,以便外键检查可以快速进行而不需要进行表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列出为第一列。如果不存在这样的索引,则会自动在引用表上创建此类索引。如果您创建了另一个可用于强制执行外键约束的索引,则可能会随后静默删除此索引。如果给定了index_name,则如前所述使用它。
因此,索引是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接