关于这个错误,我已经阅读了很多答案,但似乎没有一个答案能帮助我解决这个问题。
我得到的错误是
#1215 - Cannot add foreign key constraint 当我做show engine innodb status时,它给了我这样的信息:
无法在引用的表中找到索引,其中引用的列显示为第一列,或表中的列类型和引用的表不匹配约束。注意,在用>= InnoDB4.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;我不明白的是,为什么它说我需要引用列的索引,因为您可以清楚地看到,引用的列是主键,应该隐式创建索引。所以这个错误对我来说似乎没有意义。
我尝试过这个问题的答案中的大部分建议,但似乎都没有帮助。
过去我一直使用PostgreSQL,所以我不太熟悉大多数MySQL错误,但是这个项目要求我使用MySQL。任何帮助都将不胜感激。
发布于 2015-11-26 23:45:28
结果发现问题在于数据库的排序。我的数据库排序规则被设置为utf8_general_ci,但它没有工作。我删除了数据库,使用utf8_unicode_ci创建了新的数据库,然后按预期工作。因此,数据库排序规则和表排序规则似乎应该匹配。
摘录自题为使用外键约束的手册页:
MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。如果引用表不存在,则自动在该表上创建这样的索引。如果创建另一个可用于强制执行外键约束的索引,则稍后可能会悄悄删除此索引。如果给出了index_name,则按前面描述的方式使用。
所以各项指标都很好。
https://stackoverflow.com/questions/33948349
复制相似问题