Laravel 迁移 - 外键不适用于 table

Laravel migrations - foreign key not applying to the table

我试过使用迁移添加外键约束。迁移完成,没有任何错误。但是,在检查数据库时,table并没有添加外键约束。除了 FK 约束外,迁移中指定的其他内容工作正常。

我的支点 table 与 FKs:

Schema::create('book_author', function (Blueprint $table) {

            $table->integer('book_id')->unsigned();
            $table->integer('author_id')->unsigned();

            $table->foreign('book_id')->references('id')->on('book')->onDelete('restrict')->onUpdate('cascade');
            $table->foreign('author_id')->references('id')->on('author')->onDelete('restrict')->onUpdate('cascade');
            $table->primary(['book_id','author_id']);

        });
        Schema::enableForeignKeyConstraints();

作者 table:

Schema::create('author', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email', 250)->unique();
        });

图书table:

 Schema::create('book', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
        });

这里有什么我遗漏的吗?

将您的 book_author 迁移更改为:

Schema::create('book_author', function (Blueprint $table) {
    $table->integer('book_id')->unsigned()->index();
    $table->integer('author_id')->unsigned()->index();

    $table->foreign('book_id')->references('id')->on('book')->onDelete('cascade')->onUpdate('cascade');
    $table->foreign('author_id')->references('id')->on('author')->onDelete('cascade')->onUpdate('cascade');
});

这应该有效。


另一方面,您的 table 名字打破了一些 Laravel 惯例:

  1. 以复数形式命名您的 tables (authors & books)
  2. 支点table (book_author) 应该被称为 (author_book) - 字母顺序优先

MyISAM 不支持外键:http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

运行 以下命令可确定您的 table 使用的是哪个引擎:

SHOW TABLE STATUS WHERE Name = 'book_author'

如果显示MyISAM,你有两个选择:

  1. 根本不使用 FK
  2. 更换引擎

我会选择选项 2,因为您正在创建一个新的 table 并且这里没有丢失数据的风险。

您可以通过以下方式强制迁移:

$table->engine = 'InnoDB';

或者,您可以手动 运行 此命令:

ALTER TABLE book_author ENGINE=INNODB