InnoDB: изменение длины первичного ключа VARCHAR - PullRequest
1 голос
/ 24 ноября 2010

У меня есть таблица в InnoDB, которая использует ForeignKey на основе VARCHAR:

CREATE TABLE `portal_equity` (
   `isin` varchar(12) NOT NULL,
    ....,
    PRIMARY KEY (`isin`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Другая таблица имеет ограничение ForeignKey для этой таблицы:

CONSTRAINT `equity_id_refs_isin_2581bb1d` FOREIGN KEY (`equity_id`) REFERENCES `portal_equity` (`isin`)

Мне нужно было изменить длину столбца VARCHAR с первичным ключом, поэтому я и сделал. Теперь я продолжаю получать следующую ошибку целостности каждый раз, когда хочу сослаться на строку из таблицы «portal_equity», где isin превышает исходную длину 12.

Сбой ограничения внешнего ключа для таблицы investtor. portal_equitypastvalue: ОГРАНИЧЕНИЕ equity_id_refs_isin_7eed44e7 ИНОСТРАННЫЙ КЛЮЧ (equity_id) ССЫЛКИ portal_equity (isin) Попытка добавить в дочернюю таблицу, в индекс portal_equitypastvalue_equity_id_6e7526e1 кортеж: DATA TUPLE: 3 поля; 0: лен 12; шестнадцатеричный 304c55303332333133343030; asc 0LU032313400 ;; 1: лен 3; гекс 8fb578; asc x ;; 2: лен 4; гекс 8001398а; asc 9 ;;

Но в родительской таблице investtor. portal_equity, в индексе PRIMARY наиболее близким совпадением, которое мы можем найти, является запись: ФИЗИЧЕСКАЯ ЗАПИСЬ: n_fields 9; компактный формат; биты информации 0 0: лен 13; шестнадцатеричный 304c5530333233313334303036; asc 0LU0323134006 ;; 1: лен 6; гекс 000000005139; asc Q9 ;; 2: лен 7; гекс 800000002d0110; asc - ;; 3: лен 4; гекс 61736466; asc asdf ;; 4: лен 4; гекс 80000050; asc P ;; 5: лен 3; гекс 736466; asc sdf ;; 6: лен 4; гекс 80000001; asc ;; 7: лен 2; гекс 4144; ASC AD ;; 8: лен 0; гекс; asc ;;

Нужно ли восстанавливать все ограничения на внешние ключи? Это кажется чрезмерным. Это поведение / ошибка задокументировано где-то?

1 Ответ

1 голос
/ 25 ноября 2010

Нужно ли восстанавливать все ограничения на иностранные ключи?

Да.

Это кажется чрезмерным.

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

Хотя документация гласит: «Длина типов строк не обязательно должна быть одинаковой», логический смысл подсказывает, что поле внешнего ключа должно быть, по крайней мере, таким же, как любые данные, которые вы хотите сохранить в нем..

Удачи!

...