我的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"外键约束是 形成错误")
答案 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不接受外键......