【问题标题】:Laravel - add foreign key on existing table with dataLaravel - 在现有表上添加外键和数据
【发布时间】:2017-11-28 09:49:06
【问题描述】:

我有现有的表 objects 与数据。现在我需要添加名为holdings 的新表,并将对象关系添加到holdings 表。在迁移文件中,我打印了这个:

$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");

并在尝试迁移时收到此错误

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`kolomnaoffice`.`#sql-f10_126` 
CONSTRAINT `objects_holding_id_foreign` FOREIGN KEY (`holding_id`) 
REFERENCES `holdings` (`id`) ON DELETE NO ACTION) (SQL: alter table `objects` add constraint 
`objects_holding_id_foreign` foreign key (`holding_id`) references `holdings` 
(`id`) on delete NO ACTION)

我有正确的数据库结构(InnoDB),字段存在并且类型正确(int)。唯一不同的是表objects是填满了数据,表holdings是新的空的。

【问题讨论】:

  • 尝试将其设为可为空的列

标签: mysql laravel foreign-keys migration laravel-5.4


【解决方案1】:

holding_id 列应为 unsigned

新建一个迁移文件并迁移,迁移代码应该是这样的:

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->change();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

调用change()方法改变现有列的结构。

不需要调用onDelete("NO ACTION")方法。

【讨论】:

  • down() 函数怎么样?如果我需要回滚迁移?
  • 更改是针对之前有列的情况,但是对于存在的表和数据,我们需要添加带有空 inex 的外键,例如 [..] ->index()->nullable();
【解决方案2】:

感谢 Mohammad,但这个解决方案对我不起作用,因为我是 Laravel 5.4 并且这里有不同的情况,我的另一个表已经存在,我在这里找到的可能对某些人有帮助。

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->index()->nullable();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

index()nullable() 成功了。

编辑 不需要index() 只需nullable()

【讨论】:

  • 我想知道可以为空的外键是否是个好主意?如果我错了,请纠正我
  • @toing_toing 在我的情况下,表中充满了数据,这将使添加没有默认值的外键变得非常困难,因此nullable() 可能是一个很好的解决方案,那么如果你想改变后者在您更改数据时。
【解决方案3】:

要添加外键,首先确保您的列被标记为无符号。

只需在您的行前添加一行:

$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2021-06-02
    • 2011-10-07
    相关资源
    最近更新 更多