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

Laravel数据库迁移外键错误

林德辉
2023-03-14

我有两个表,事务表和付款表,它们在过去的迁移中已经存在。当我试图在它们之间建立一个透视表时,只会得到事务外键的一个错误。“payments”表上的另一个外键创建得很好。这绝对让我感到困惑,我之前关于这个错误的讨论都没有解决这个问题。

错误(参考,MAccounting是数据库的名称):


    [Illuminate\Database\QueryException]                                         
      SQLSTATE[HY000]: General error: 1005 Can't create table 'MRAccounting.#sql-  
      563_2d7' (errno: 150) (SQL: alter table `payment_transaction` add constrain  
      t payment_transaction_transaction_id_foreign foreign key (`transaction_id`)  
       references `transactions` (`id`))         


*尽管错误似乎说,payment_transaction表创建成功,以及支付表的外键;唯一中断的是交易的外键。

事务表:



    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;

    class CreateTransactionsTable extends Migration {

        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('transactions', function(Blueprint $table)
            {
                $table->increments('id');
                $table->string('name');
                $table->decimal('balance', 7,2);
                $table->integer('account_id');
                $table->integer('pending_id');
                $table->timestamps();
            });
        }


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

    }

付款表:



    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;

    class CreatePaymentsTable extends Migration {

        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('payments', function(Blueprint $table)
            {
                $table->increments('id');
                $table->integer('account_to');
                $table->integer('account_from');
                $table->decimal('amount',7,2);
                $table->timestamps();
            });
        }


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

    }

数据透视表:


    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;

    class CreatePaymentTransactionTable extends Migration {

        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('payment_transaction', function(Blueprint $table)
            {
                $table->increments('id');
                $table->unsignedInteger('payment_id');
                $table->unsignedInteger('transaction_id');
                $table->timestamps();

                // $table->foreign('payment_id')->references('id')->on('payments');
                // $table->foreign('transaction_id')->references('id')->on('transactions');

            });

            Schema::table('payment_transaction', function(Blueprint $table){
                $table->foreign('payment_id')->references('id')->on('payments');
                $table->foreign('transaction_id')->references('id')->on('transactions');
            });


        }


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

    }

*******************让它工作,但我仍然需要找出这是如何发生的*******不幸的是,一个干净的安装解决了这个问题。这很好,很漂亮,我现在可以继续开发,但是像这样进行干净的安装并不一定是我在生产环境中所拥有的便利。我需要弄清楚是什么原因/如何重新创建它。

共有3个答案

童宏富
2023-03-14

对于透视表,请使用以下迁移:

public function up() {
    Schema::create('payment_transaction', function(Blueprint $table) {
        $table->increments('id');
        $table->unsignedBigInteger('payment_id');
        $table->foreign('payment_id')->references('id')->on('payments');
        $table->unsignedBigInteger('transaction_id');
        $table->foreign('transaction_id')->references('id')->on('transactions');
    });
}
柴琦
2023-03-14

在主键和外键上使用unsigned()标志。

柳高卓
2023-03-14

您可以通过使类型为INT(10)的payment_transaction.payment_id未签名来修复所有这些混乱。在这种情况下,payments.idINT(10)AUTO_INCREAMENT将相等引用将起作用。

 类似资料:
  • Laravel5.6运行于:PHP7.2,MariaDB 10.3 当我想为我的表设置外键时,我只是不断地犯这个错误。 在其他表中,由Laravel本身定义的所有id变量和无符号自动增量 所以,我的迁移是这样的: 错误如下所示: SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解在LINE 1(SQL:alter

  • 我有一个问题与我的Laravel迁移:( 当我运行php artisan migrate时,它会在外键上停止。 首次迁移 还有第二个 运行命令后,我出现以下错误: [Illumb\Database\QueryException] SQLSTATE[HY000]:一般错误:1005无法创建表gsb_larave.35; sql-176_b9(错误号:150“外键约束格式不正确”)(sql:alter

  • 错误: SQLSTATE[HY000]:常规错误: 1005不能创建表.(errno: 150"外键约束格式不正确")(SQL:更改表添加约束外键()引用()在删除级联) 有人能解释一下该怎么办吗? 我想要达到的是。如果我想删除一个客户端,它也应该删除具有相同客户端id的用户,但我无法实现,因为我无法迁移外键 迁移: 用户表 客户表 模型: 用户关系 客户关系

  • 我花了一整天的时间试图弄清楚下面的迁移发生了什么。 这是表的迁移。我的想法是使用“id_stays_abroad”和“user_id”作为外键。 这是添加外键的另一个迁移 当我运行php artisan迁移时,我遇到了以下错误: SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table

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

  • 这是通过使用包含以下内容的SQL转储移植旧项目来学习Laravel(特别是v5.x)的一种尝试: 在垃圾堆的底部有一个与此特定表格相关的: 来自一对stackoverflow问题1、2、3;我修改了原始代码,将Schema::table的外键从Schema::create中拆分出来,并将unsigned()添加到每个字段: 但在使用新创建的空DB进行迁移时,仍然会出现错误: 根据MySQL,这意味