SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.12.2016 23:04:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Ошибки внешних ключей

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

Неактивен

 

#2 09.12.2016 11:06:15

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 127

Re: Ошибки внешних ключей

Спасибо!

Неактивен

 

#3 23.12.2016 21:45:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Дополнил случаем секционированных таблиц (А7).
Обратил внимание, что если родительская таблица является секционированной, то

show engine innodb status;
пишет
Cannot resolve table name close to:

что, насколько я понимаю, указывает на то, что таблица не может быть найдена в словаре данных innodb.

Действительно ли информация о секционированной таблице не хранится в словаре данных innodb или я неправильно трактую сообщение или что-то ещё?

Неактивен

 

#4 24.12.2016 20:15:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3735

Re: Ошибки внешних ключей

vasya, опиши подробнее как воспроизвести ошибку в show engine innodb status;

Неактивен

 

#5 24.12.2016 20:47:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

В MariaDB 5.5

create table t1 (a int, index(a))
engine=innodb
partition by range (a)  
(partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than maxvalue);

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table 'test.t2' (errno: 150)

show engine innodb status;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
161223 19:38:14 Error in foreign key constraint of table test/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
--------

Неактивен

 

#6 24.12.2016 20:56:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3735

Re: Ошибки внешних ключей

5.6.24-72.2 Percona Server:

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2016-12-24 20:53:17 7f48d005b700 Error in foreign key constraint of table test/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
------------
 


Скорее всего сообщение в SHOW ENGINE INNODB STATUS является неточным.

Неактивен

 

#7 24.12.2016 21:13:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Тоже склоняюсь к такому мнению, только сообщение в данном случае ошибочное.

Неточное, это когда при не совпадении типов, он пишет
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.

Неактивен

 

#8 24.12.2016 21:38:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3735

Re: Ошибки внешних ключей

Неактивен

 

#9 24.12.2016 23:01:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3735

Re: Ошибки внешних ключей

vasya, в Oracle согласны с твоей позицией. Багу подтвердили и указали, что она есть в версиях 5.6,5.7 и 8.0

Неактивен

 

#10 24.12.2016 23:35:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Спасибо

А почему они не подтверждают для более ранних, например, 5.5? Разве её поддержка больше не осуществляется?

Неактивен

 

#11 28.12.2016 18:49:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Убрал примеры в сворачиваемые блоки. Имхо, стало гораздо более читабельно.

И похоже ещё одна бага:
если родительская таблица разбивается на секции после создания внешнего ключа, то в MariaDB 5.5

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

alter table t1 PARTITION BY HASH(a) PARTITIONS 8;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

show engine innodb status;
-- не содержит секцию LATEST FOREIGN KEY ERROR
-- это явно бага, т.к. при вышеуказанной ошибке возникает логичное
-- желание уточнить через show engine innodb status;
 


Но в MySQL 5.7
alter table t1 PARTITION BY HASH(a) PARTITIONS 8;
ERROR 1506 (HY000): Foreign keys are not yet supported in conjunction with partitioning

и тут уже отсутствие LATEST FOREIGN KEY ERROR является логичным.
Точнее можно дискутировать бага это или нет.

У кого есть возможность проверить в 5.6?

Неактивен

 

#12 28.12.2016 19:06:30

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 1981

Re: Ошибки внешних ключей

Код:

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;
тож не показал


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#13 28.12.2016 19:09:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

спасибо

Неактивен

 

#14 28.12.2016 19:24:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Неактивен

 

#15 28.12.2016 19:41:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 1981

Re: Ошибки внешних ключей

А чего бы не приложить полный вывод show engine innodb status?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#16 28.12.2016 19:42:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Стоит ли включать в статью случай, когда секционированной является дочерняя таблица?

На мой взгляд - нет, т.к. ответ сервера там понятный и однозначный даже в старых версиях:


create table t1 (a int, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a)) partition by range (a)  
(partition p0 values less than (10),  
partition p1 values less than (20),
partition p2 values less than maxvalue);
ERROR 1506 (HY000): Foreign key clause is not yet supported in conjunction with partitioning

Неактивен

 

#17 28.12.2016 19:45:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

deadka написал:

А чего бы не приложить полный вывод show engine innodb status?

имхо, он громоздкий и только затруднит восприятие текста.
Краткость - сестра таланта.
Всё равно сотрудники будут воспроизводить это у себя на разных версиях.

Неактивен

 

#18 29.12.2016 12:24:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5006

Re: Ошибки внешних ключей

Багу подтвердили.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson