mysql无法添加外键#1215

时间:2015-11-26 23:22:25

标签: mysql indexing foreign-keys

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

我得到的错误是

#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;

我不明白为什么它说我需要索引引用的列,因为您可以清楚地看到引用的列是主键,并且应该隐式创建索引。所以这个错误对我来说似乎没有意义。

我已经从this question的答案中尝试了大部分建议,但似乎没有任何帮助。

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

1 个答案:

答案 0 :(得分:6)

事实证明问题出在数据库整理上。我的db排序规则设置为utf8_general_ci,但它无效。我删除了数据库,并使用utf8_unicode_ci创建了新数据库,然后按预期工作。所以似乎数据库排序规则和表格排序应匹配。

来自名为Using FOREIGN KEY Constraints的手册页,摘录:

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

因此指数很好。