mysql无法添加外键#1215

Seh*_*ael 4 mysql indexing foreign-keys

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

我得到的错误是

#1215 - Cannot add foreign key constraint 
Run Code Online (Sandbox Code Playgroud)

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

在引用的表中找不到索引,其中引用的列显示为第一列,或者表中的列类型与引用的表不匹配约束.请注意,使用> = InnoDB-4.1.12创建的表中ENUM和SET的内部存储类型已更改,旧表中的此类列不能被新表中的此类列引用.

以下是涉及的表(我正在创建一个创建脚本,并且在执行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;
Run Code Online (Sandbox Code Playgroud)

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

我从这个问题的答案中尝试了大部分建议,但似乎都没有帮助.

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

Seh*_*ael 6

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

从名为" 使用FOREIGN KEY约束 "的手册页中,摘录如下:

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

所以指数很好.