我的mysql数据库有parent_table
utf-8,有2列(id varchar(14),名称varchar(256))
然后我为这个表创建了一个主键,组成了2列,但是我必须用有限的200长度创建它, - 因为最大索引长度问题 - 这样
alter table parent_table add primary key(id,name (200));
每件事都没问题,直到我创建一个新的child_table
外键引用父,子表有2列(child_id varchar(14),child_name varchar(256))
注意:两个表都是相同的编码(utf-8),相同的引擎,相同的数据类型,相同的长度 虽然每当我尝试创建外键时
alter table child_table add foreign key test_foreign_key (child_id,
child_name) references parent_table (id, name);
我总是收到错误
错误代码:1005。无法创建表
mci
。#sql-1724_3
(错误:150"外键约束形成错误")
然后,当我将主键放在parent_table
中并将parent_table
和child_table
中的名称列修改为varchar(200),然后在parent_table
中创建主键{1}}通常没有限制,如:
alter table parent_table add primary key(id,name);
然后当我在child_table
中创建外键时,就可以了!!!
不幸的是,我无法在我的真实数据库中将名称列长度更改为200,因为它已经塞满了更长的数据。
如何在child_table
中创建引用parent_table
中索引长度有限(200)的复合(2列)主键的外键?我可以做这样的事吗..
alter table child_table add foreign key test_foreign_key (child_id,
child_name) references parent_table (id, name(200)); // 200
答案 0 :(得分:0)
我知道了,我的具体情况的答案是,我不能
正如documentation所说
MySQL需要外键和引用键的索引才能......
它也说
如果引用表不存在,则会自动在引用表上创建
所以在我的情况下发生的事情是,当我尝试创建外键时,mysql首先尝试在外键列上创建索引,但由于最大索引长度问题,它无法 < / em>,当我尝试在parent_table
上创建主键时发生同样的问题,这迫使我在parent_table
alter table parent_table add primary key(id,name (200));
所以,我必须将parent_table
中的主键更改为另一个不需要前缀索引的较短长度列,以便为mysql提供在其上创建索引的机会child_table
在同一文档中也有一个有趣的说明,
不支持外键列上的索引前缀。这样做的一个结果是BLOB和TEXT列不能包含在外键中,因为这些列上的索引必须始终包含前缀长度