Can';t使用laravel数据库迁移创建外键

Can';t使用laravel数据库迁移创建外键,laravel,database-migration,Laravel,Database Migration,我的Laravel迁移有问题:( 当我运行php artisan migrate时,它会在外键上停止 首次迁移 /** * Run the migrations. * * @return void */ public function up() { Schema::enableForeignKeyConstraints(); Schema::create('fichefrais', function (Blueprint $table) { $table-

我的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');
}
运行命令后,我出现以下错误:

[照亮\数据库\查询异常]
SQLSTATE[HY000]:一般错误:1005无法创建表 gsb#U larave.#sql-176#b9(错误号:150“外键约束无效 格式不正确”)(SQL:alter table LINGEFRAISHORS forfait 添加约束lignefraishorsforfait_mois_外键 (MOI)在更新时删除级联时参考fichefrais(MOI) 级联)

[PDO异常]
SQLSTATE[HY000]:一般错误:1005无法创建表 gsb#U laravel.#sql-176#b9(错误号:150“外键约束为 格式不正确的“)


您正在使用MySQL,您的表在InnoDB引擎中定义了吗?MyISAM不接受外键…

您的visiteur表是否有一个id作为主键?如果是,它是否有数据类型haschar长度4LignefraishorFait**表的数据类型为char,必须与visiteur表中的主键相同。

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

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

此外,还应按以下顺序创建表:

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

2-“fichefrais”表

3-“LINGEFRAISHORSFORFAIT”表。 只需更改数据库/迁移的日期,如下所示(示例):

无法首先创建包含外键的表,因为该表中没有要引用的键。

使用此迁移:

第一次迁移(fichefrais):

第二次迁移(lignefraishorsffait):


这最好作为一个注释而不是答案。问题可能是您在
fichefrais上有一个复合主键,并且在
lignefraishorfait上的两个不同的FK处引用它。可能尝试
$table->foreign(数组('idVisiteur','mois')->引用('fichefrais'上的数组('idVisiteur','mois')->);
我以为是这样的,所以我尝试了您的解决方案,但仍然有相同的错误。当我尝试使用phpmyadmin创建外键时,错误涉及列类型,但它是相同的
    2020_09_11_150331_create_etat_table.php   
    2020_09_12_000000_create_fichefrais_table.php
    2020_09_13_000000_create_lignefraishorsforfait_table.php
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');
    });
}
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);
    });
}