Laravel数据库迁移外键错误


Laravel Database Migration foreign key error

我有两个表,交易和付款,它们在过去的迁移中已经存在。 当我尝试在它们之间创建数据透视表时,我只收到事务的外键错误。 另一个外键,在"付款"表上,创建得很好。 这绝对让我感到困惑,我之前发现的关于此错误的讨论都没有解决问题。

错误(作为参考,MAccount 是数据库的名称):

   [Illuminate''Database''QueryException]                                              SQLSTATE[HY000]: 一般错误: 1005 无法创建表 'MRAccounting.#sql-       563_2d7' (errno: 150) (SQL: alter table 'payment_transaction' add conlimit       t payment_transaction_transaction_id_foreign外键("transaction_id")        引用"交易"("ID"))        

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

交易表:

使用照明''数据库''迁移''迁移;    使用照明''数据库''模式''蓝图;    类 CreateTransactionsTable 扩展迁移 {       /**         * 运行迁移。         *         * @return无效         */       公共函数 up()        {            Schema::create('transactions', function(Blueprint $table)            {                $table->增量('id');                $table->字符串("名称");                $table->十进制("余额",7,2);                $table->整数('account_id');                $table->整数('pending_id');                $table->时间戳();            });        }/**         * 反向迁移。         *         * @return无效         */       公共函数 down()        {            Schema::d rop('transactions');        }    }

付款表:

使用照明''数据库''迁移''迁移;    使用照明''数据库''模式''蓝图;    类 CreatePaymentsTable 扩展迁移 {       /**         * 运行迁移。         *         * @return无效         */       公共函数 up()        {            Schema::create('payments', function(Blueprint $table)            {                $table->增量('id');                $table->整数('account_to');                $table->整数('account_from');                $table->十进制("金额",7,2);                $table->时间戳();            });        }/**         * 反向迁移。         *         * @return无效         */       公共函数 down()        {            模式::d rop('付款');        }    }

数据透视表:

   使用照明''数据库''迁移''迁移;    使用照明''数据库''模式''蓝图;    类 CreatePaymentTransactionTable 扩展迁移 {       /**         * 运行迁移。         *         * @return无效         */       公共函数 up()        {            Schema::create('payment_transaction', function(Blueprint $table)            {                $table->增量('id');                $table->无符号整数('payment_id');                $table->无符号整数('transaction_id');                $table->时间戳();                $table->外国('payment_id')->参考('id')->on('付款');                $table->外国('transaction_id')->引用('id')->on('交易');            });            Schema::table('payment_transaction', function(Blueprint $table){                $table->外国('payment_id')->参考('id')->on('付款');                $table->外国('transaction_id')->引用('id')->on('交易');            });}/**         * 反向迁移。         *         * @return无效         */       公共函数 down()        {            Schema::d rop('payment_transaction');        }    }
****

**不幸的是,全新安装解决了这个问题。 这很好,而且很花哨,我现在可以继续开发,但是像这样进行全新安装不一定是我在生产环境中的便利。 我需要弄清楚是什么原因造成的/如何重新创建它。

您可以通过

制作INT(10) unsigned类型的payment_transaction.payment_id来修复所有这些混乱。 在这种情况下,payments.id INT(10) AUTO_INCREAMENT将是相等的,您的引用将起作用。

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

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

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');
    });
}

你为什么不试试这个:

$table->integer('payment_id')->unsigned();
$table->integer('transaction_id')->unsigned();