Неадекватное поведение MySQL при миграциях

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
maxyc
Сообщения: 124
Зарегистрирован: 2010.01.13, 09:11

Неадекватное поведение MySQL при миграциях

Сообщение maxyc »

Миграциями в пхп не пользовался как раз из-за этой траблы.

Предыстория.
Ни разу не случалось, чтоб под Yii2 миграция с первого раза проходила до конца. Но в данный момент это было последней каплей.

Воспроизведение ошибки
1. Создаем миграцию

Код: Выделить всё

        $this->createTable('doctors_speciality', [
            'doctor_id'=>'INT(11) NOT NULL',
            'speciality_id'=>'INT(11) NOT NULL',
        ]);

        $this->createIndex('doctor_id','doctors_speciality','doctor_id');
        $this->createIndex('speciality_idэ,'doctors_speciality','speciality_id');

        $this->addForeignKey('fk_doctor_id', 'doctors_speciality', 'doctor_id', 'doctors', 'id');
        $this->addForeignKey('fk_speciality_id', 'doctors_speciality', 'speciality_id', 'specialities', 'id');
2. Смотрим в список таблиц. SHOW TABLES

Код: Выделить всё

mysql> show tables;
+---------------------+
| Tables_in_dockids   |
+---------------------+
| cities              |
| doctors             |
| migration           |
| reviews             |
| specialities        |
+---------------------+
5 rows in set (0.00 sec)
3. Запускаем миграцию

Код: Выделить всё

*** applying m141024_075914_create_doctors_specilaities_table
    > create table doctors_speciality ... done (time: 0.133s)
    > create index doctor_id on doctors_speciality (doctor_id) ... done (time: 0.168s)
    > create index speciality_id on doctors_speciality (speciality_id) ... done (time: 0.211s)
    > add foreign key fk_doctor_id: doctors_speciality (doctor_id) references doctors (id) ...Exception 'yii\db\Exception' with message 'SQLSTATE[HY000]: General error: 1005 Can't create table 'dockids.#sql-2a77_3e' (errno: 121)
The SQL being executed was: ALTER TABLE `doctors_speciality` ADD CONSTRAINT `fk_doctor_id` FOREIGN KEY (`doctor_id`) REFERENCES `doctors` (`id`)'

in /var/www/left/dockids.loc/vendor/yiisoft/yii2/db/Schema.php:532

Error Info:
Array
(
    [0] => HY000
    [1] => 1005
    [2] => Can't create table 'dockids.#sql-2a77_3e' (errno: 121)
)
4. Смотрим Изображение
Индексы есть, таблица на месте.

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

Код: Выделить всё

mysql > ALTER TABLE `doctors_speciality` ADD CONSTRAINT `fk_doctor_id` FOREIGN KEY (`doctor_id`) REFERENCES `doctors` (`id`)
ERROR 1005 (HY000): Can't create table 'dockids.#sql-2a77_4d' (errno: 121)     
Ругается на ошибку так же...

6. Попытаемся добавить руками через phpMyadmin (HeidySQL такая же лабуда, потому на старенького и немощного pma не надо гнать)
Изображение
Фигакс.
Изображение
Помимо ошибки нас выкинуло из pma/HeidySQL
7. Авторизовываемся. заходим в базу.
8. Видим
Изображение
Наша таблица пропала! Более того, я с таким именем больше не могу создать таблицу заново!

Код: Выделить всё

CREATE TABLE `doctors_speciality` (
    `doctor_id` INT(11) NOT NULL,
    `speciality_id` INT(11) NOT NULL
)

Код: Выделить всё

SQLSTATE[HY000]: General error: 1005 Can't create table 'dockids.doctors_speciality' (errno: 150)
Подобное получается воспроизвести только в Yii2 Migrations, с 1 версией и с руби такого не было замечено.

/var/log/mysql/error.log

Код: Выделить всё

 php -v
PHP 5.5.9-1ubuntu4.4 (cli) (built: Sep  4 2014 06:56:34) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

Код: Выделить всё

mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.40-0ubuntu0.14.04.1-log (Ubuntu)
 
maxyc
Сообщения: 124
Зарегистрирован: 2010.01.13, 09:11

Re: Неадекватное поведение MySQL при миграциях

Сообщение maxyc »

пс. Удалил базу. ЗАпустил заново миграции кроме последней, что в посте. Создал руками таблицу и ключи. Полет нормальный.
В чем может быть проблема?
Аватара пользователя
ifelse
Сообщения: 227
Зарегистрирован: 2013.02.05, 13:05

Re: Неадекватное поведение MySQL при миграциях

Сообщение ifelse »

Проблема не с миграциями, а с вашим окружением.
doctors => id первичный ключ? Поле также INT(11)?
После попытки миграции выполните в phpmyadmin запрос "SHOW ENGINE INNODB STATUS", там ищите "LATEST FOREIGN KEY ERROR".
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Неадекватное поведение MySQL при миграциях

Сообщение chungachguk »

maxyc писал(а):Миграциями в пхп не пользовался как раз из-за этой траблы.
А я, наоборот, перешёл на миграции - надоело вручную запрос писать )

Подобные косяки проявлялись на битой БД.
Аватара пользователя
denisOgr
Сообщения: 133
Зарегистрирован: 2012.02.02, 13:18
Контактная информация:

Re: Неадекватное поведение MySQL при миграциях

Сообщение denisOgr »

Дело не с миграциями, они просто упрощают вам то, что вы делаете через phpmyadmin ( и не только)
Скорее всего вы хотите сделать foreign key поля таблицы, котораое не похоже по типу на ссылаемое поле.
Покажите sql для таблиц: doctors и specialities
prorepin
Сообщения: 1
Зарегистрирован: 2016.05.13, 11:15

Re: Неадекватное поведение MySQL при миграциях

Сообщение prorepin »

Столкнулся с такой же проблемой, что и ТС, и суть проблемы заключается во вполне адекватном поведении mysql.
Дело в том что 121 ошибка, это исключение обработанное yii во время конфликта имен Mysql . Для решения проблемы нужно изменить fk -name, или проверить схему, на существование ключа с таким же именем.

Для проверки юзать можно запрос

SELECT
constraint_name,
table_name
FROM
information_schema.table_constraints
WHERE
constraint_type = 'FOREIGN KEY'
AND table_schema = DATABASE()
ORDER BY
constraint_name;
Ответить