在这种情况下是否可以拥有可以为空的外键?

时间:2017-06-02 18:22:22

标签: php html mysql laravel

我正在努力创建'团队'具有竞争表的外键的表,但是如何将外键设置为可空?

Schema::create('teams', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->unique();
    $table->string('place');
    $table->string('competition')->nullable()->default(null);
    $table->foreign('competition')->references('name')->on('competitions')->onDelete('set null');
    $table->timestamps();
});

Schema::create('competitions', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->unique();
    $table->timestamps();
});

3 个答案:

答案 0 :(得分:2)

FK可以接受可以接受,这只是意味着你的团队不属于竞争对手,所以我认为你有正确的想法。我猜你得到一个错误,因为你试图在创建return strdup(my_buffer); 表之前将strdup()表与teams表关联起来。

首先创建competitions表。如果已创建competitions表,则可能需要先将其删除,然后再次尝试运行迁移。

它也可能是competitions列上与之相关的问题。理想情况下,您应该命名该列teams而不是name,并将其与competition_id表中的competition列相关联。让竞争对手的id列与您一样独特,应具有预期的效果,但查询可能会更慢,因为它会在varchar上创建更大的索引。

如果您在competitions列上执行此操作,如果您需要更新比赛名称,则可能会遇到更多问题。如果你与id有关,这绝不是一个问题,因为你通常不会改变id。我认为你的仍然可以这样工作,你只需要为你的FK添加一个name

答案 1 :(得分:0)

您只需要在创建+---------+----+----+-------------+-------+-----+ | ID | DC | OC | ElapsedTime | Units | UPH | +---------+----+----+-------------+-------+-----+ | 2375935 | fb | pu | 03:44:00 | 263 | 70 | | 11259 | fb | pu | 04:50:00 | 553 | 114 | +---------+----+----+-------------+-------+-----+ 表之前先创建competitions表。

答案 2 :(得分:0)

试试这样:

Schema::create('competitions', function (Blueprint $table) {
      $table->increments('id');
      $table->string('name')->unique();
     $table->timestamps();
});    

Schema::create('teams', function (Blueprint $table) {
      $table->increments('id');
      $table->string('name')->unique();
      $table->string('place');
      $table->string('competition')->nullable()->default(null);
      $table->timestamps();
 });

Schema::table('teams', function (Blueprint $table) {
     $table->foreign('competition')->references('name')
      ->on('competitions')->onDelete('set null');
 });