如果我不在Laravel中设置外键约束,会发生什么不好的事情吗?

时间:2018-10-02 02:12:49

标签: laravel eloquent

严格来说,我知道这不是最佳实践,但是在Laravel中设置外键始终是一个巨大的痛苦。

像这样简单的事情可能在70%的时间内失败了。有时有充分的理由,有时只是……因为感觉就像那样。自然也没有有意义的错误消息。

    Schema::table('accounts', function(Blueprint $table){
        $table->integer('package_id')->unsigned();
        $table->foreign('package_id')->references('id')->on('packages')->onDelete('set null');
    });

现在,该应用程序完全可以正常运行,并且所有关系都可以正常运行,而无需在数据库中设置外键,因此完全忽略它们是否有任何实际危害?

1 个答案:

答案 0 :(得分:3)

此Laravel语法$table->foreign('package_id')->references('id')->on('packages')->onDelete('set null')有两个主要作用:

  1. 创建外键(及其约束)。这样做的好处是数据一致性(ACID中的C)。不使用外键意味着DBMS无法保证表的一致性(例如,将packages指向已删除的accounts)。如果确实不需要数据一致性或由其他层(例如,应用程序层)处理,则这可能不是问题。阅读此answer了解更多详细信息。
  2. 创建外键索引。好处是使用外键(在这种情况下为package_id)的查询具有更好的性能。当行数很大时,此好处变得更加明显。如果表不会存储大量行,则可以忽略此行。在此article中了解更多详细信息。