<rmcreative>

RSS

MySQL, InnoDB и внешние ключи

14 мая 2010

Довольно часто при попытке создать внешний ключ MySQL вываливает невнятные errno: xxx. Их описания в большинстве случаев ничего не дают, даже запутывают ещё больше.

Реальных причин может быть несколько:

  1. Тип таблицы, на которую указывает ключ не InnoDB, SolidDB или PBXT.

  2. С одной из сторон ключа нет индекса (да, создавать его надо руками).

  3. С одной из сторон ключа нет столбца с указанными именем.

  4. Неверное описание отношения, например ON DELETE SET NULL для столбца NOT NULL.

  5. Ограничение с таким именем уже есть.

  6. Несовпадение типов полей, связываемых отношением. Например, нельзя использовать с одной стороны int(10) unsigned, а с другой int(11) или bigint.

  7. Нарушение целостности данных (integrity violation), т.е. когда ссылающийся id прописан, а в связываемой таблице его нет.

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

Комментарии RSS

  1. №2550
    Артём Курапов
    Артём Курапов 15 мая 2010 г., 15:41:32
    1. несовпадение типов полей.. скажем int 10 unsigned и int 11 или bigint

    2. нарушение целостности данных (integrity violation) - когда ссылающийся id прописан, а в связываемой таблице его нет

  2. №2552
    Sam
    Sam 16 мая 2010 г., 13:44:52

    Спасибо. Дополнил.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.