Can';t使用laravel数据库迁移创建外键
我的Laravel迁移有问题:( 当我运行php artisan migrate时,它会在外键上停止 首次迁移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-
/**
* 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);
});
}