Подтвердить что ты не робот

Добавление внешнего ключа в существующую таблицу дает ошибку 1050 таблица уже существует

У меня есть таблица 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' уже существует.

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Похоже, есть отчет об ошибке в этом MySQL:

Ошибка MySQL 55296

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

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

Ответ 4

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

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

Чтобы изменить движок таблицы:

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

Теперь измените двигатель!

Ответ 5

  • Проверьте тип хранилища для таблицы CustomizationSet.

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

Ответ 6

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

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);

Ответ 7

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

Ответ 8

У меня была аналогичная проблема, и в итоге это была проблема Ограничения целостности. Столбец Foreign Key ссылался на чужой столбец, который didnt  существуют.

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

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);

Ответ 9

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

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