Vip7777
@Vip7777

Почему добавление внешних ключей при миграции приводит к ошибке SQLSTATE[HY000]: General error: 1215 и миграция не завершается?

Помогите, пожалуйста разобраться новичку в Yii2, вроде по документации делаю, но что-то не так.
Пробую посредством миграции добавить таблицу в БД, остальные таблицы создавались ВРУЧНУЮ.
Возможно кто-то пробовал с помощью миграции в рабочую БД(СОЗДАНА ВРУЧНУЮ) добавлять новые таблицы и прописывать к нем Foregn_key?
Типы полей id, из старых таблиц , к которым пытаюсь привязать поля из вновь создаваемой таблицы соответствуют типам полей внешних ключей новой таблицы int(11) , поля, к которым устанавливается связь по внешним ключам проиндексированы и являются первичными ключами в своих таблицах.
Таблица в БД добавляется со всеми прописанными полями и типами как надо, поле для внешнего ключа индексируется, но привязки не происходит.
В таблице миграции соответственно внешних ключей нет, так как на этапе создания ключей происходит ошибка(из терминала):
> add foreign key fk-comment-author_id: {{%comment}} (author_id) references {{%user}} (id) ...Exception: SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

The SQL being executed was: ALTER TABLE `comment` ADD CONSTRAINT `fk-comment-author_id` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`) ON DELETE CASCADE (D:\open-server\OSPanel\domains\yii2.loc\vendor\yiisoft\yii2\db\Schema.php:678)
#0 D:\open-server\OSPanel\domains\yii2.loc\vendor\yiisoft\yii2\db\Command.php(1304): yii\db\Schema->convertException().............................................................

В результате выполнения миграции в терминале :
*** failed to apply m210415_065603_create_comment_table (time: 0.644s)
0 from 1 migrations were applied.
Migration failed. The rest of the migrations are canceled.

В createTable методе пробовал типы полей задавать также и с помощью Schema::, но разницы нет.

public function safeUp()
    {
        $this->createTable('{{%comment}}', [
            'id' =>  $this->primaryKey(),
            'author_id' => Schema::TYPE_INTEGER.' NOT NULL',
            'text' => $this->text()->notNull(),
            'parent_id' => $this->integer(),
            'product_id' => $this->integer()->notNull(),
            'moderation' => $this->boolean(),
            'created' => $this->date(),
            'is_admin' => $this->boolean(),
        ]);

      // creates index for column `product_id`
      $this->createIndex(
        'idx-comment-product_id',
        'comment',
        'product_id',
      );

      // add foreign key for table `product` ОШИБКА ПРОИСХОДИТ ВО ВРЕМЯ ЭТОЙ ОПЕРАЦИИ
      $this->addForeignKey(
        'fk-comment-product_id',
        'comment',
        'product_id',
        'product',
        'id',
        'CASCADE',
      );

      // creates index for column `author_id`
      $this->createIndex(
        'idx-comment-author_id',
        'comment',
        'author_id'
      );

      // add foreign key for table `user` ОШИБКА ПРОИСХОДИТ ВО ВРЕМЯ ЭТОЙ ОПЕРАЦИИ
      $this->addForeignKey(
        'fk-comment-author_id',
        '{{%comment}}',
        'author_id',
        '{{%user}}',
        'id',
        'CASCADE'
      );

    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {

      // drops foreign key for table `user`
      $this->dropForeignKey(
        'fk-comment-author_id',
        'comment',
      );

      // drops index for column `author_id`
      $this->dropIndex(
        'idx-comment-author_id',
        'comment',
      );

      // drops foreign key for table `product`
      $this->dropForeignKey(
        'fk-comment-product_id',
        'comment',
      );

      // drops index for column `product_id`
      $this->dropIndex(
        'idx-comment-product_id',
        'comment',
      );

        $this->dropTable('{{%comment}}');
    }


ВОПРОС ЗАКРЫТ.
Сделал миграции нескольких новых таблиц и сразу прописать поля с внешними ключами между ними, заработало , значит дело в мешанине таблиц из миграции и старых таблиц базы.
Всем , кто принял участие в поиске проблемы, спасибо!
  • Вопрос задан
  • 369 просмотров
Решения вопроса 1
Vip7777
@Vip7777 Автор вопроса
Сделал миграции нескольких новых таблиц и сразу прописать поля с внешними ключами между ними, заработало , значит дело в мешанине таблиц из миграции и старых таблиц базы.
Всем , кто принял участие в поиске проблемы, спасибо!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kawabanga
@kawabanga
1) Проверьте тип базы, вдруг MyISAM ?
2) проверьте, чтобы
comment'.product_id'
и
'product'.'id'

Имели единый тип, 'product_id' => $this->integer()->notNull(), мало ли, вдруг product у вас bigint ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы