无法通过laravel迁移创建外键

时间:2017-03-23 19:54:22

标签: mysql laravel laravel-migrations

我的Laravel迁移存在问题:(

当我正在运行php artisan migrate时,它会在外键上停止。

首次迁移

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::enableForeignKeyConstraints();
    Schema::create('fichefrais', function (Blueprint $table) {
        $table->char('idVisiteur', 4);
        $table->foreign('idVisiteur')->references('id')->on('visiteur');
        $table->char('mois',6);
        $table->primary(['idVisiteur', 'mois']);
        $table->integer('nbJustificatifs');
        $table->decimal('montantValide', 10, 2);
        $table->date('dateModif');
        $table->char('idEtat', 2);
        $table->foreign('idEtat')->references('id')->on('etat');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('fichefrais');
}

和第二个

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::enableForeignKeyConstraints();
    Schema::create('lignefraishorsforfait', function (Blueprint $table) {
        $table->integer('id');
        $table->primary('id');
        $table->char('idVisiteur', 4);
        $table->char('mois',6);
        $table->foreign('idVisiteur')->references('idVisiteur')->on('fichefrais');
        $table->foreign('mois')->references('mois')->on('fichefrais');
        $table->char('libelle', 100);
        $table->date('date');
        $table->decimal('montant', 10, 2);
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('lignefraishorsforfait');
}

运行命令后,我收到此错误:

  

[照亮\数据库\ QueryException]
  SQLSTATE [HY000]:常规错误:1005无法创建表   gsb_larave。#sql-176_b9(错误号:150"外键约束是   错误形成")(SQL:alter table lignefraishors forfait   添加约束lignefraishorsforfait_mois_foreign外键   (mois)在更新时引用删除级联上的fichefrais(mois)   级联)

     

[PDOException]
  SQLSTATE [HY000]:常规错误:1005无法创建表   gsb_laravel。#sql-176_b9(错误号:150"外键约束是   形成错误")

5 个答案:

答案 0 :(得分:0)

您的 visiteur 表是否将ID作为主键?如果是,是否数据类型具有字符长度 4 。 ** lignefraishorsforfait **表中的 idVisiteur 的数据类型为char,必须与 visiteur 表中的主键相同。

答案 1 :(得分:0)

问题是您声明的外键不会引用主键。如果要为非主键创建外键,则“fichefrais”表中的“mois”列必须为其上具有唯一约束的列

答案 2 :(得分:0)

首先,您的外键必须引用主键(大多数情况下是“ id”列)。

您还应该按以下顺序创建表:

1-'etat'表(我看不到您没有发布迁移代码的bcs),

2-'fichefrais'表,

3-'lignefraishorsforfait'表。 只需像这样更改数据库/迁移上的日期(示例):

    2020_09_11_150331_create_etat_table.php   
    2020_09_12_000000_create_fichefrais_table.php
    2020_09_13_000000_create_lignefraishorsforfait_table.php

您不能首先创建包含外键的表,因为它将没有要引用的键。

答案 3 :(得分:0)

使用此迁移:

第一次迁移(fichefrais):

public function up()
{
    Schema::create('fichefrais', function (Blueprint $table) {
        $table->integer('idVisiteur')->unsigned()->nullable();
        $table->foreign('idVisiteur')->references('id')->on('visiteur');
        $table->char('mois',6);
        $table->primary(['idVisiteur', 'mois']);
        $table->integer('nbJustificatifs');
        $table->decimal('montantValide', 10, 2);
        $table->date('dateModif');
        $table->integer('idEtat')->unsigned()->nullable();
        $table->foreign('idEtat')->references('id')->on('etat');
    });
}

第二次迁移(lignefraishorsforfait):

public function up()
{
    Schema::create('lignefraishorsforfait', function (Blueprint $table) {
        $table->integer('id');
        $table->primary('id');
        $table->integer('mois')->unsigned()->nullable();
        $table->foreign('mois')->references('mois')->on('fichefrais');
        $table->integer('idVisiteur')->unsigned()->nullable();
        $table->foreign('idVisiteur')->references('idVisiteur')->on('fichefrais');
        $table->char('libelle', 100);
        $table->date('date');
        $table->decimal('montant', 10, 2);
    });
}

答案 4 :(得分:-1)

您正在使用MySQL,那么您的表是否在InnoDB引擎中定义? MyISAM不接受外键......