nie*_*lsv 0 mysql database foreign-keys laravel laravel-5
我在运行迁移时遇到问题。我有一个包含一些表的 mysql 数据库。具体表是product_blender。表中的一些字段是这样的:
- 身份证(PK)
- area_id (FK)
- 居民(varchar)
- heat_type_id (FK)
- ...
现在我想创建另一个名为installateur_types. 该表需要包含一个PK和一个varchar 字段。我还想在表中创建一个FKproduct_blender到我新创建的表的ID。
这就是我所做的:
创建迁移以创建表:
public function up()
{
Schema::create('installateur_types', function(Blueprint $table)
{
$table->increments('id');
$table->string('type');
});
}
public function down()
{
Schema::drop('installateur_types');
}
Run Code Online (Sandbox Code Playgroud)
运行迁移,这是成功的。表是用正确的字段创建的。
然后我创建了迁移以将 FK 字段添加到 product_blender 表中。
public function up()
{
Schema::table('product_blenders', function ($table) {
$table->integer('installateurtype_id')->unsigned();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
});
}
public function down()
{
//
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
如果您的products_blender表不为空,那么当您添加一个非空的新列(这是 eloquent 的默认值)时,它将自行假设一些默认值。这个值在这个新列所引用的表中可能不可用,从而导致外键约束失败。
解决此问题的方法之一是为新列提供默认值或仅使其可为 null。
$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)
还有另一种解决方案,可以关闭此检查,可以使用DB::statement('SET FOREIGN_KEY_CHECKS=0;'). 然后再次将那个转为DB::statement('SET FOREIGN_KEY_CHECKS=1;')。在您的代码中,您可以执行以下操作
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$table->integer('installateurtype_id')->unsigned();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |