InnoDB: изменение длины первичного ключа VARCHAR

У меня есть таблица в InnoDB, в которой используется внешний ключ на основе 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: CONSTRAINT equity_id_refs_isin_7eed44e7 FOREIGN KEY (equity_id) REFERENCES portal_equity (isin) Попытка добавить в дочернюю таблицу индекс portal_equitypastvalue_equity_id_6e7526e1 tuple: DATA TUPLE: 3 поля; 0: длина 12; шестнадцатеричный 304c55303332333133343030; по возрастанию 0LU032313400;; 1: длина 3; шестнадцатеричный 8fb578; по возрастанию х;; 2: длина 4; шестигранник 8001398а; восходящий 9 ;;

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

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


person miracle2k    schedule 24.11.2010    source источник


Ответы (1)


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

Да.

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

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

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

Удачи!

person Riedsio    schedule 24.11.2010
comment
Собственно, сами ограничения FOREIGN KEY обновлять не нужно. Вместо этого фактические поля в этих дочерних таблицах, хранящие первичный ключ, по-прежнему имели старую длину, что я полностью упустил, что довольно глупо. Частично я виню ORM, который автоматически создает эти поля внешнего ключа и как бы удерживает их от моего внимания. - person miracle2k; 28.11.2010