Добавление внешнего ключа к существующей таблице дает ошибку 1050, таблица уже существует - PullRequest
19 голосов
/ 11 августа 2011

У меня есть таблица CustomizationSet с колонками:

customization_set_guid (which is a non-nullable guid and also the primary key)
creator_account_guid
and a few others

И таблица с существующими данными Регистрация с колонками:

registration_id (an int and the primary key)
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null)
and a few other columns

Когда я пытаюсь запустить

ALTER TABLE Registration ADD FOREIGN KEY 
    (
        customization_set_guid
    ) REFERENCES CustomizationSet (
        customization_set_guid
    );

в MySQL Workbench выдает ошибку 1050Table '. \ Dbname \ registration' уже существует.

Если я пытаюсь использовать пользовательский интерфейс для добавления внешних ключей на вкладке Foreign Keys вкладкиИзмените диалоговое окно таблицы и выберите CustomizationSet в качестве ссылочной таблицы, это не позволяет мне выбрать customization_set_guid в списке столбцов.

Я действительно не уверен, почему он не позволит мне добавить этот внешний ключ.Я только что успешно создал внешние ключи между таблицами, которые я только что добавил.Стол регистрации существует некоторое время ...

Ответы [ 9 ]

8 голосов
/ 24 октября 2011

Я получил ту же ошибку, и это было связано с тем, что внешний ключ уже существовал.То, что вы хотите, это просто добавить ограничение:

ALTER TABLE Registration 
  ADD CONSTRAINT idx_Registration_CustomizationSet 
  FOREIGN KEY (customization_set_guid) 
  REFERENCES CustomizationSet(customization_set_guid);
2 голосов
/ 29 июня 2012

Итак, один из членов команды понял это. Одна таблица была установлена ​​с типом utf8_general, а другая была установлена ​​на тип по умолчанию. Я не думал, что это проблема, так как по умолчанию используется utf8_general, но, очевидно, mysql просто смотрит на имена типов, а не на базовый тип.

2 голосов
/ 15 июня 2012

Похоже, что сообщение об ошибке на MySQL находится здесь:

MySQL Bug 55296

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

В какой-то момент они упоминают, что типы не совпадают, и верстак отвечал с неправильной ошибкой (это должно было быть errno 150 или errno 121). Вы можете увидеть причины этих ошибок здесь: Ошибки внешнего ключа MySQL и ошибка 150

1 голос
/ 03 октября 2013
  • Проверьте тип механизма хранения для таблицы CustomizationSet.

У меня была такая же проблема, но я мог решить ее, изменив тип двигателя на InnoDB, потому что несколько типов не поддерживают ограничения внешнего ключа.

1 голос
/ 02 мая 2013

Я получил ту же ошибку, и так как мой случай еще не был упомянут, я опубликую этот ответ, и, надеюсь, он может сэкономить кому-то время!

Мои две таблицы двигателей, где разные. Один был InnoDB, а другой MyIsam.

Чтобы заменить двигатель стола:

выберите стол, нажмите «изменить таблицу», а затем нажмите эту двойную стрелку на самый правый из верстака (так что он будет направлен вверх).

Теперь поменяй двигатель!

0 голосов
/ 01 ноября 2017

При использовании MysqlWorkbench ошибка вводит в заблуждение. Моя проблема заключалась в том, что я пытался добавить ограничение внешнего ключа в таблицу, в которой уже были строки, и одна из строк была пустой (не соответствует ограничению FK. Вместо того, чтобы жаловаться, что ограничение не будет выполнено в случае применения, MysqlWorkbench сообщил, что таблица существует.

Удаление исправленной ошибочной строки (или добавление и ограничение допустимого значения в поле) решило проблему.

0 голосов
/ 20 января 2014

У меня была похожая проблема, и в итоге это была проблема Ограничение целостности . Столбец внешнего ключа ссылался на внешний столбец, который не есть.

Попробуйте выполнить следующее, чтобы проверить, так ли это:

select r.customization_set_guid, c.customization_set_guid
from Registration r
right join CustomizationSet c
on 
r.customization_set_guid = c.customization_set_guid
where isnull(c.customization_set_guid);
0 голосов
/ 11 августа 2011

Не уверен насчет уже существующей таблицы, но причина, по которой он не позволяет выбрать нужный столбец, скорее всего, из-за того, что столбцы не одного типа. Убедитесь, что они одинакового типа, одинаковой длины и имеют одинаковые параметры.

0 голосов
/ 11 августа 2011

Я не уверен, что это опечатка, но не должно быть

ALTER TABLE Registration ADD FOREIGN KEY 
(
    customization_set_guid
) REFERENCES CustomizationSet (
    customization_set_guid
);

быть чем-то вроде

ALTER TABLE Registration ADD FOREIGN KEY 
customization_set_guid_fk (customization_set_guid) 
REFERENCES CustomizationSet (customization_set_guid);
...