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 惯例:
- 以复数形式命名您的 tables (authors & books)
- 支点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
,你有两个选择:
- 根本不使用 FK
- 更换引擎
我会选择选项 2,因为您正在创建一个新的 table 并且这里没有丢失数据的风险。
您可以通过以下方式强制迁移:
$table->engine = 'InnoDB';
或者,您可以手动 运行 此命令:
ALTER TABLE book_author ENGINE=INNODB
我试过使用迁移添加外键约束。迁移完成,没有任何错误。但是,在检查数据库时,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 惯例:
- 以复数形式命名您的 tables (authors & books)
- 支点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
,你有两个选择:
- 根本不使用 FK
- 更换引擎
我会选择选项 2,因为您正在创建一个新的 table 并且这里没有丢失数据的风险。
您可以通过以下方式强制迁移:
$table->engine = 'InnoDB';
或者,您可以手动 运行 此命令:
ALTER TABLE book_author ENGINE=INNODB