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.任何帮助,将不胜感激.
事实证明问题出在数据库整理上.我的db collation设置为utf8_general_ci,但它无法正常工作.我删除了数据库,并使用utf8_unicode_ci它创建了新数据库,然后按预期工作.所以似乎数据库排序规则和表排序规则应该匹配.
从名为" 使用FOREIGN KEY约束 "的手册页中,摘录如下:
MySQL需要外键和引用键的索引,以便外键检查可以快速,不需要表扫描.在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列.如果引用表不存在,则会自动在引用表上创建此索引.如果您创建另一个可用于强制执行外键约束的索引,则可以稍后以静默方式删除此索引.如果给定,则使用index_name,如前所述.
所以指数很好.
| 归档时间: |
|
| 查看次数: |
3026 次 |
| 最近记录: |