首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql无法添加外键#1215

mysql无法添加外键#1215
EN

Stack Overflow用户
提问于 2015-11-26 23:22:24
回答 1查看 4.6K关注 0票数 6

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

我得到的错误是

代码语言:javascript
复制
#1215 - Cannot add foreign key constraint 

当我做show engine innodb status时,它给了我这样的信息:

无法在引用的表中找到索引,其中引用的列显示为第一列,或表中的列类型和引用的表不匹配约束。注意,在用>= InnoDB4.1.12创建的表中更改了ENUM和SET的内部存储类型,新表中的此类列不能引用旧表中的此类列。

下面是所涉及的表(我正在创建脚本,在执行sql时会出现错误)

代码语言:javascript
复制
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。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-26 23:45:28

结果发现问题在于数据库的排序。我的数据库排序规则被设置为utf8_general_ci,但它没有工作。我删除了数据库,使用utf8_unicode_ci创建了新的数据库,然后按预期工作。因此,数据库排序规则和表排序规则似乎应该匹配。

摘录自题为使用外键约束的手册页:

MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。如果引用表不存在,则自动在该表上创建这样的索引。如果创建另一个可用于强制执行外键约束的索引,则稍后可能会悄悄删除此索引。如果给出了index_name,则按前面描述的方式使用。

所以各项指标都很好。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33948349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档