我已经阅读了很多关于这个错误的回答问题,但没有一个答案似乎能帮我解决问题。
我得到的错误是
#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。任何帮助,将不胜感激。
答案 0 :(得分:6)
事实证明问题出在数据库整理上。我的db排序规则设置为utf8_general_ci
,但它无效。我删除了数据库,并使用utf8_unicode_ci
创建了新数据库,然后按预期工作。所以似乎数据库排序规则和表格排序应匹配。
来自名为Using FOREIGN KEY Constraints的手册页,摘录:
MySQL要求外键和引用键上的索引 外键检查可以很快,不需要表扫描。在里面 引用表时,必须有一个索引所在的外键 列以相同顺序列为第一列。这样的 如果不是,则会自动在引用表上创建索引 存在。如果您创建,可能会稍后以静默方式删除此索引 另一个可用于强制执行外键约束的索引。 如果给定,则使用index_name,如前所述。
因此指数很好。