Задавайте вопросы, мы ответим
Вы не зашли.
Написал статью, в которой описал все известные мне причины возникновения ошибок внешних ключей, сведя их в единую таблицу для удобства диагностики. Если кому-то известны варианты оставшиеся "за кадром", отпишитесь плиз.
Неактивен
Спасибо!
Неактивен
Дополнил случаем секционированных таблиц (А7).
Обратил внимание, что если родительская таблица является секционированной, то
show engine innodb status;
пишет
Cannot resolve table name close to:
что, насколько я понимаю, указывает на то, что таблица не может быть найдена в словаре данных innodb.
Действительно ли информация о секционированной таблице не хранится в словаре данных innodb или я неправильно трактую сообщение или что-то ещё?
Неактивен
vasya, опиши подробнее как воспроизвести ошибку в show engine innodb status;
Неактивен
В MariaDB 5.5
Неактивен
5.6.24-72.2 Percona Server:
Неактивен
Тоже склоняюсь к такому мнению, только сообщение в данном случае ошибочное.
Неточное, это когда при не совпадении типов, он пишет
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Неактивен
Неактивен
vasya, в Oracle согласны с твоей позицией. Багу подтвердили и указали, что она есть в версиях 5.6,5.7 и 8.0
Неактивен
Спасибо
А почему они не подтверждают для более ранних, например, 5.5? Разве её поддержка больше не осуществляется?
Неактивен
Убрал примеры в сворачиваемые блоки. Имхо, стало гораздо более читабельно.
И похоже ещё одна бага:
если родительская таблица разбивается на секции после создания внешнего ключа, то в MariaDB 5.5
Неактивен
mysql> select version(); +-------------------------+ | version() | +-------------------------+ | 5.6.31-0ubuntu0.15.10.1 | +-------------------------+ 1 row in set (0.00 sec) mysql> create table t11 (a int, index(a)) engine=innodb; Query OK, 0 rows affected (0.01 sec) mysql> create table t22 (a int, foreign key (a) references t11(a)) engine=innodb; Query OK, 0 rows affected (0.01 sec) mysql> alter table t11 PARTITION BY HASH(a) PARTITIONS 8; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Инфы про LATEST FOREIGN KEY ERROR
show engine innodb status;
тож не показал
Неактивен
спасибо
Неактивен
Неактивен
А чего бы не приложить полный вывод show engine innodb status?
Неактивен
Стоит ли включать в статью случай, когда секционированной является дочерняя таблица?
На мой взгляд - нет, т.к. ответ сервера там понятный и однозначный даже в старых версиях:
Неактивен
deadka написал:
А чего бы не приложить полный вывод show engine innodb status?
имхо, он громоздкий и только затруднит восприятие текста.
Краткость - сестра таланта.
Всё равно сотрудники будут воспроизводить это у себя на разных версиях.
Неактивен
Багу подтвердили.
Неактивен
Багу исправили в MySQL 8.0.14
https://bugs.mysql.com/bug.php?id=84331
Daniel Price написал:
Fixed as of the upcoming 8.0.14 release, and here's the changelog entry:
After attempting to create a table with a foreign key constraint that
referenced a partitioned table, which is an unsupported operation, SHOW
ENGINE INNODB STATUS output incorrectly reported a foreign key error
indicating that the referenced table name could not be resolved. This
error no longer appears, and the error message returned to the client now
states that foreign keys are not yet supported in conjunction with
partitioning.
Неактивен