如何添加引用2列主键的外键"限制长度"

时间:2016-05-21 01:24:09

标签: mysql

我的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_tablechild_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

1 个答案:

答案 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列不能包含在外键中,因为这些列上的索引必须始终包含前缀长度