2016-05-21 2 views
2

У меня есть база данных mysql, которая имеет parent_table utf-8 с 2 столбцами (id varchar (14), имя varchar (256)) then I создал первичный ключ для этой таблицы, составляющего 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 нормально, без ограничения, например:

alter table parent_table add primary key(id,name); 

тогда, когда я создал внешний ключ в child_table, он работал !!!

К сожалению, я не могу изменить длину столбца имени до 200 в моей реальной базе данных, потому что он уже заполнен более длинными данными.

как я могу создать внешний ключ в child_table, который ссылается на композит (2 колонки) первичный ключ в parent_table с ограниченной длины индекса (200)? могу сделать что-то вроде этого ..

alter table child_table add foreign key test_foreign_key (child_id, 
child_name) references parent_table (id, name(200)); // 200 
+0

Можете ли вы создать SQLFiddle, чтобы мы могли видеть вашу структуру, потому что это только тип данных выпуск ......... –

+0

@PiyushGupta [ссылка] (http://sqlfiddle.com/#!9/602e7/1) **, но я думаю, что эта ссылка не будет жить вечно **, поэтому здесь создаются инструкции 'create table parent_table (id varchar (14), имя varchar (256)) CHARACTER SET utf8 COLLATE utf8_bin; создать таблицу chield_table (chield_id varchar (14), chield_name varchar (256)) CHARACTER SET utf8 COLLATE utf8_bin; alter table parent_table добавить первичный ключ (id, name (200)); ', обратите внимание, что это первый раз, когда я использую sqlfiddle, так что простите меня, если я что-то пропустил –

+0

Как я могу понять Если вы хотите изменить родительский стол, тогда сначала вам необходимо удалить связанное ограничение внешнего ключа, а затем изменить таблицу, и после изменения вы можете снова применить одно и то же ограничение внешнего ключа ............ Но убедитесь, что оба типа данных должны быть одинаковыми, иначе вы не сможете применить ограничение внешнего ключа ... –

ответ

0

Я получил его, ответ на мою конкретную ситуацию, я не могу

как documentation говорит

MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы ...

, и это также говорит

Такой индекс создается на ссылающейся таблице автоматически, если он не существует

так, что происходит в моем случае в том, что, когда я пытался создайте внешний ключ, mysql попытался сначала создать индекс в столбце внешнего ключа, но он не смог бы из-за проблемы с максимальной длиной индекса, той же самой проблемы, которая произошла, когда я попытался создать первичный ключ на parent_table, который заставил меня создать префикс «ограниченная длина» первичный ключ на parent_table

alter table parent_table add primary key(id,name (200)); 

так, я должен изменить первичный ключ в parent_table на другую короткую колонку длины, которая не требует индекса префикса , чтобы дать MySQL возможность создания индекса на той же колонке в child_table

также была интересная заметка в одной и той же документации, говорит

Префиксы индексов на столбцах внешнего ключа не поддерживаются. Одним из следствий этого является то, что столбцы BLOB и TEXT не могут быть включены в внешний ключ, потому что индексы в этих столбцах всегда должны содержать длину префикса