Laravel 在通过 ssh 使用 migration:fresh 时显示 1215(无法添加外键约束)
Laravel showing 1215(Cannot add foreign key constraint) when using migration:fresh through ssh
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查看更多详情。
我解决了一些方法,但我想承认,每个人都应该非常严格地使用Laravel迁移。
哪里出错了?
- 我在 localhost 上工作,所以在开发过程中,你需要对你的 table 结构进行大量更改,并且在此过程中我还需要重新生成 tables 很多时间,所以我想法是,我不需要为每个修改创建另一个迁移文件,因为我现在正在重新生成所有内容,当应用程序完成并且我需要进行更改时,那时我将使用单独的迁移文件。
有什么问题吗?
- Laravel 正在根据迁移文件创建日期创建 tables,它永远不会使用您的文件更新 :P,因此当一个 table 创建并需要外键时来自另一个尚未创建的 table,它会产生此错误。
因此,如果您的 FK 指向 PK,请确保源列存在。
如何解决?
- 调整迁移文件的生成顺序。按顺序生成新文件,复制内容,删除乱序的旧文件。
这绝不是一个好主意,所以请严格遵守规则。
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查看更多详情。
我解决了一些方法,但我想承认,每个人都应该非常严格地使用Laravel迁移。
哪里出错了?
- 我在 localhost 上工作,所以在开发过程中,你需要对你的 table 结构进行大量更改,并且在此过程中我还需要重新生成 tables 很多时间,所以我想法是,我不需要为每个修改创建另一个迁移文件,因为我现在正在重新生成所有内容,当应用程序完成并且我需要进行更改时,那时我将使用单独的迁移文件。
有什么问题吗?
- Laravel 正在根据迁移文件创建日期创建 tables,它永远不会使用您的文件更新 :P,因此当一个 table 创建并需要外键时来自另一个尚未创建的 table,它会产生此错误。
因此,如果您的 FK 指向 PK,请确保源列存在。
如何解决?
- 调整迁移文件的生成顺序。按顺序生成新文件,复制内容,删除乱序的旧文件。
这绝不是一个好主意,所以请严格遵守规则。