Laravel使用迁移时显示1215(无法添加外键约束):通过ssh刷新

时间:2018-09-28 07:16:56

标签: php laravel-5.6 laravel-migrations

Laravel 5.6.38

MySQL 5.7.23

PHP v7.2.10

在localhost PHP 7.2.4中,它在localhost上工作正常,但在生产环境中显示以下错误。

php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `videos` add constraint `videos_video_status_id_foreign` foreign key (`video_status_id`) references `statuses` (`status_id`))

  at /var/www/html/myapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint")
      /var/www/html/myapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  2   PDOStatement::execute()
      /var/www/html/myapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  Please use the argument -v to see more details.

这是它在本地主机中运行的方式

D:\work\www\myapp>php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_08_29_112331_entrust_setup_tables
Migrated:  2018_08_29_112331_entrust_setup_tables
Migrating: 2018_08_31_103313_create_audits_table
Migrated:  2018_08_31_103313_create_audits_table
Migrating: 2018_09_06_125909_create_videos_table
Migrated:  2018_09_06_125909_create_videos_table
Migrating: 2018_09_12_064922_create_labels_table
Migrated:  2018_09_12_064922_create_labels_table
Migrating: 2018_09_14_073215_create_statuses_table
Migrated:  2018_09_14_073215_create_statuses_table
Migrating: 2018_09_14_114329_create_video_taggings_table
Migrated:  2018_09_14_114329_create_video_taggings_table
Migrating: 2018_09_15_105623_create_priorities_table
Migrated:  2018_09_15_105623_create_priorities_table
Migrating: 2018_09_17_044820_create_comments_table
Migrated:  2018_09_17_044820_create_comments_table
Migrating: 2018_09_24_130041_create_video_tagging_q_as_table
Migrated:  2018_09_24_130041_create_video_tagging_q_as_table

与@apokryfos讨论后更新

现在迁移文件是

2014_10_12_000000_create_users_table
2014_10_12_100000_create_password_resets_table
2018_08_29_112331_entrust_setup_tables
2018_08_31_103313_create_audits_table
2018_09_06_064922_create_labels_table
2018_09_06_073215_create_statuses_table
2018_09_06_105623_create_priorities_table
2018_09_06_125909_create_videos_table
2018_09_14_114329_create_video_taggings_table
2018_09_17_044820_create_comments_table
2018_09_24_130041_create_video_tagging_q_as_table

我遇到错误

Dropped all tables successfully.
Migration table created successfully.

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `videos` add constraint `videos_video_identified_by_foreign` foreign key (`video_identified_by`) references `users` (`id`))

  at D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint")
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  2   PDOStatement::execute()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

所以,问题不在于创建迁移文件的日期,而是不同。

请使用参数-v查看更多详细信息。

1 个答案:

答案 0 :(得分:0)

我以某种方式解决了它,但是我想承认,每个人都应该非常严格地使用Laravel迁移。

怎么了?

  • 我在localhost上工作,因此在开发过程中,您需要对表结构进行大量更改,并且在此过程中还需要大量时间重新生成表,所以我想的是,我不需要创建另一个表每次修改的迁移文件,因为我现在正在重新生成所有内容,当应用程序完成并且需要进行更改时,在那时,我将使用单独的迁移文件。

出了什么问题?

  • Laravel按照迁移文件创建日期创建表,它将永远不会使用文件:P进行文件更新,因此当创建一个表并需要来自另一个尚未创建的表的外键时,它将产生此表错误。

因此,如果您的FK指向PK,请确保源列存在。

如何解决?

  • 调整迁移文件的生成顺序。按正确的顺序生成新文件,复制内容,然后删除无序的旧文件。

这绝不是一个好主意,因此请严格遵守规则。