Как добавить Foreign Key в таблицу MySQL?

Пытаюсь связать 2 таблицы, таблицу пользователя и ранга.

В миграциях Yii2, по порядку:

Таблица пользователей:
$this->createTable('{{%user}}', [
            'id' => Schema::TYPE_INTEGER  . ' NOT NULL AUTO_INCREMENT',
            'username' => Schema::TYPE_STRING . ' NOT NULL',
            'level' => Schema::TYPE_INTEGER . ' NOT NULL DEFAULT 1',
            'PRIMARY KEY (id)',
        ], $tableOptions);


Таблица рангов:
$this->createTable('{{%ranks}}', [
            'level' => Schema::TYPE_INTEGER . ' NOT NULL DEFAULT 1',
            'rank' => Schema::TYPE_STRING . ' NOT NULL',
            'exp' => Schema::TYPE_INTEGER . ' NOT NULL'
        ], $tableOptions);

$this->addForeignKey("ranks_fk", "{{%ranks}}", "level", "{{%user}}", "level", 'RESTRICT');


Выдает ошибку:
> add foreign key ranks_fk: {{%ranks}} (level) references {{%user}} (level) ...Exception 'yii\db\Exception' with message 'SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
The SQL being executed was: ALTER TABLE `ranks` ADD CONSTRAINT `ranks_fk` FOREIGN KEY (`level`) REFERENCES `user` (`level`) ON DELETE RESTRICT'

in C:\OpenServer\domains\site-dev\vendor\yiisoft\yii2\db\Schema.php:503

Error Info:
Array
(
    [0] => HY000
    [1] => 1215
    [2] => Cannot add foreign key constraint
)


Подскажите, в чем проблема?
  • Вопрос задан
  • 16421 просмотр
Решения вопроса 1
1) Поля должны быть ключами. В таблице User поле level проиндексируйте (в phpmyadmin есть кнопочка с молнией "Index")
2) Поля должны быть одинаковы по типу и по ограничениям. Если первое поле Integer с ограничением в 11 символов, то и второе должно быть Integer 11 символов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
phpnt
@phpnt
Комментировать
поле level должно быть ключом
Ответ написан
@Torkalas
Таблица пользователей:
добавить:
$this->createIndex('level','{{%user}}','level', true);
$this->addForeignKey("ranks_fk", "{{%user}}", "level", "{{%ranks}}", "level", 'CASCADE');

Таблица рангов:
заменить:
'level' => Schema::TYPE_INTEGER . ' NOT NULL DEFAULT 1',

на :
'level' => Schema::TYPE_PK  . ' NOT NULL AUTO_INCREMENT',

удалить строку:
$this->addForeignKey("ranks_fk", "{{%ranks}}", "level", "{{%user}}", "level", 'RESTRICT');
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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