Laravel 数据库迁移外键错误

Posted

技术标签:

【中文标题】Laravel 数据库迁移外键错误【英文标题】:Laravel Database Migration foreign key error 【发布时间】:2015-03-02 12:57:32 【问题描述】:

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

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

[照亮\数据库\查询异常] SQLSTATE [HY000]:一般错误:1005 无法创建表 'MRAccounting.#sql- 563_2d7' (errno: 150) (SQL: alter table `payment_transaction` 添加约束 t payment_transaction_transaction_id_foreign外键(`transaction_id`) 引用`事务`(`id`))

*尽管错误似乎在说什么,payment_transaction 表已成功创建,还有payments 表的外键;唯一破坏的是交易的外键。

交易表:

使用 Illuminate\Database\Migrations\Migration; 使用 Illuminate\Database\Schema\Blueprint; 类 CreateTransactionsTable 扩展迁移 /** * 运行迁移。 * * @return 无效 */ 公共函数 up() Schema::create('transactions', function(Blueprint $table) $table->increments('id'); $table->string('name'); $table->decimal('余额', 7,2); $table->integer('account_id'); $table->integer('pending_id'); $table->timestamps(); ); /** * 逆转迁移。 * * @return 无效 */ 公共函数向下() Schema::drop('transactions');

付款表:

使用 Illuminate\Database\Migrations\Migration; 使用 Illuminate\Database\Schema\Blueprint; 类 CreatePaymentsTable 扩展迁移 /** * 运行迁移。 * * @return 无效 */ 公共函数 up() Schema::create('payments', function(Blueprint $table) $table->increments('id'); $table->integer('account_to'); $table->integer('account_from'); $table->decimal('金额',7,2); $table->timestamps(); ); /** * 逆转迁移。 * * @return 无效 */ 公共函数向下() Schema::drop('payments');

数据透视表:

使用 Illuminate\Database\Migrations\Migration; 使用 Illuminate\Database\Schema\Blueprint; 类 CreatePaymentTransactionTable 扩展迁移 /** * 运行迁移。 * * @return 无效 */ 公共函数 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'); ); /** * 逆转迁移。 * * @return 无效 */ 公共函数向下() Schema::drop('payment_transaction');

************************ 得到它的工作,但我仍然需要弄清楚这是怎么发生的 ******** 不幸的是,全新安装解决了这个问题。这很好,花花公子,我现在可以继续开发,但是像这样进行干净安装并不一定是我在生产环境中的便利。我需要弄清楚是什么导致了这个/如何重新创建它。

【问题讨论】:

我怀疑其他一些迁移存在错误,因为这些迁移对我来说效果很好,并且它说它无法创建表 MRAccounting。检查该表的迁移,也许? MRAccounting 是数据库的名称(我已经在问题中添加了一个注释) - 我认为它说它无法创建表的原因是它假设这就是发生的事情当它实际收到未能创建外键约束的错误时。然而,有趣的是,全新安装对您有用。 【参考方案1】:

您可以通过将payment_transaction.payment_id 设为INT(10) unsigned 类型来解决所有这些问题。在这种情况下,payments.idINT(10) AUTO_INCREAMENT 将相等,您的引用将起作用。

【讨论】:

这实际上是我最初拥有的;没有骰子。 UnsignedInteger 方法也做同样的事情。 查看数据库是否真的相同。 我认为您的表 payment_transaction 不同。 我检查了四次,因为这是我能找到的所有建议。另外,全新安装修复了它,这意味着它们不同的唯一方法是如果有人直接在数据库中更改它们。 这个想法可能是如果您的迁移之一失败,并且关闭并没有进行迁移【参考方案2】:

你为什么不试试这个:

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

【讨论】:

那和$table->unsignedInteger('payment_id');有什么区别?【参考方案3】:

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

【讨论】:

这和$table->unsignedInteger('payment_id');之间的假定区别是什么【参考方案4】:

对于您的数据透视表,请使用此迁移:

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

【讨论】:

以上是关于Laravel 数据库迁移外键错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移错误号:150“外键约束格式不正确”

Laravel 5.2 迁移:无法添加 char 数据类型的外键

使用“php artisan migrate”命令时 Laravel 数据库迁移外键错误

Laravel 迁移无法添加外键

如何在 laravel 5.1 迁移中使用外键

使用 Laravel 迁移创建外键时出现 MySQL 错误