Изменить внешний ключ без потери данных в столбце - PullRequest
0 голосов
/ 23 ноября 2018

Я проверил Google, но не нашел способа сохранить данные при изменении внешнего ключа таблицы.

У меня есть две таблицы: пользовательские события и пользовательские виды спорта

Table User Events
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| date         | date             | YES  |     | NULL    |                |
| description  | text             | YES  |     | NULL    |                |
| user_id      | int(10) unsigned | YES  | MUL | NULL    |                |
| sport_id     | int(10) unsigned | YES  | MUL | NULL    |                |
| created_at   | timestamp        | YES  |     | NULL    |                |
| updated_at   | timestamp        | YES  |     | NULL    |                |
| deleted_at   | timestamp        | YES  | MUL | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+

Table User Sports
+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name             | varchar(191)     | NO   |     | NULL    |                |
| default_sport_id | int(10) unsigned | YES  | UNI | NULL    |                |
| user_id          | int(11)          | YES  |     | NULL    |                |
| created_at       | timestamp        | YES  |     | NULL    |                |
| updated_at       | timestamp        | YES  |     | NULL    |                |
| deleted_at       | timestamp        | YES  |     | NULL    |                |
+------------------+------------------+------+-----+---------+----------------+

Перед созданием таблицы User Sports в таблице User Events у меня был внешний sport_id из таблицы Sports.

Теперь, когда я хочу изменить этот столбец на внешний ключ с Sports to Спорт пользователя таблица Я получаю это сообщение на php artisan migrate:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

Миграция работает, если я отбрасываю столбец sport_id из События пользователя , но я не хочу потерю данных.

Вот моя миграция:

public function up()
{
   Schema::table('user_events', function (Blueprint $table) {
      $table->dropForeign('event_sport_id');
   });

   Schema::table('user_events', function (Blueprint $table) {
      $table->foreign('sport_id')
            ->references('default_sport_id')
            ->on('user_sports')
            ->onDelete('set null');
   });
}

Может ли кто-нибудь указать мне правильное направление?Спасибо

1 Ответ

0 голосов
/ 23 ноября 2018

Вы должны передать массив, а не строку в метод dropForeign: $ table-> dropForeign (['event_sport_id']);

...