当前位置: 首页 > 知识库问答 >
问题:

无法使用laravel数据库迁移创建外键

申博厚
2023-03-14

我有一个问题与我的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');
}

运行命令后,我出现以下错误:

[Illumb\Database\QueryException]
SQLSTATE[HY000]:一般错误:1005无法创建表gsb_larave.35; sql-176_b9(错误号:150“外键约束格式不正确”)(sql:alter table LIGEFRAISHORS forfait添加约束LIGEFRAISHORFSFAIT_mois)外键(mois)引用fichefrais(mois)关于删除级联(关于更新级联)

[PDOException]
SQLSTATE[HY000]:一般错误:1005无法创建表gsb_laravel.#sql-176_b9(错误号:150“外键约束格式不正确”)

共有3个答案

颛孙品
2023-03-14

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

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

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

2'fichefrais'表,

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

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

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

长孙逸仙
2023-03-14

问题是您声明的外键不引用主键。如果你想创建一个外键到一个非主键,列'mois'在你的'fichefrais'表必须是一个列上有一个唯一的约束

钱睿范
2023-03-14

visiteur表是否有id作为主键?如果是,它是否具有数据类型has char和长度4。**LINGEFRAISHORSFORFAIT**表中的idVisiteur具有char数据类型,该数据类型必须与visiteur表中的主键相同。

 类似资料:
  • 我正在从事一个项目,我正在使用laravel 5.8。这里我想创建一个外键。我试了很多次,但每次都收到一条关于迁移时间的错误消息。有三个表一个是行业,是小学和学生,这些是第二个表。我想在这两个辅助表trade_id上创建一个外键作为键的名称。 这是交易表(主表)。 这是学生表(辅助表)。 这是放置表(辅助表)。 在迁移时出现错误。

  • 我想在用户表中添加一个外键: 一个用户有一个城镇(法语为ville),一个城镇可以有多个用户: 我的村庄(城镇)迁移 我重命名了迁移(我不知道这样做是否有好处?),这是我迁移的顺序,正如您所看到的,我在用户之前创建了villes: 我在终端中发现了这个错误: 照亮\数据库\查询异常 SQLSTATE[42000]:语法错误或访问冲突:1072键列“villes\u id”在表中不存在(SQL:al

  • 我有两个表,事务表和付款表,它们在过去的迁移中已经存在。当我试图在它们之间建立一个透视表时,只会得到事务外键的一个错误。“payments”表上的另一个外键创建得很好。这绝对让我感到困惑,我之前关于这个错误的讨论都没有解决这个问题。 错误(参考,MAccounting是数据库的名称): *尽管错误似乎说,payment_transaction表创建成功,以及支付表的外键;唯一中断的是交易的外键。

  • 当尝试使用artisan迁移数据库中带有表“user”的Laravel 4时: 我收到此错误: C: \xampp\htdocs\laravel [21.04.2014 02:27:56通知]目前不允许事件报告。Reaso ns:启动前或关闭后{"错误":{"类型":"Symfony\Component\HttpKernel\Exception\NotFoundHttpExcepti on","消

  • 文档:https://eggjs.org/zh-cn/tutorials/sequelize.html sequelize 数据库迁移命令 命令 含义 sequelize db:migrate 运行迁移文件 sequelize db:migrate:status 列出所有迁移的状态 sequelize db:migrate:undo 隔离数据库:迁移:撤消 sequelize db:migrate

  • 本文向大家介绍Laravel 内部数据库迁移,包括了Laravel 内部数据库迁移的使用技巧和注意事项,需要的朋友参考一下 示例 每个迁移都应该有一个up()方法和一个down()方法。该up()方法的目的是执行所需的操作,以将数据库模式置于新状态,并且该down()方法的目的是使该方法执行的所有操作反向up()。确保该down()方法正确撤消您的操作对于能够回滚数据库架构更改至关重要。 示例迁移