【问题标题】:Laravel - Integrity constraint violation: 1452Laravel - 违反完整性约束:1452
【发布时间】:2016-08-11 11:19:26
【问题描述】:

这是我的迁移:

public function up()
    {
      Schema::table('payments', function($table)
      {
        $table->dropColumn('invoice_id');
      });
    }

     public function down()
    {
      Schema::table('payments',function (Blueprint $table){
        $table->unsignedInteger('invoice_id')->index();
        $table->foreign('invoice_id')->references('id')->on('invoices')->onDelete('cascade');
      });
    }

当我运行 php artisan migrate:rollback 它给了我这个异常:

[Illuminate\Database\QueryException]                                                                                                         
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`invoiceninja`.`#sq  
  l-418_46`, CONSTRAINT `payments_invoice_id_foreign` FOREIGN KEY (`invoice_id`) REFERENCES `invoices` (`id`) ON DELETE CASCADE) (SQL: alter   
  table `payments` add constraint `payments_invoice_id_foreign` foreign key (`invoice_id`) references `invoices` (`id`) on delete cascade)     



  [PDOException]                                                                                                                               
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`invoiceninja`.`#sq  
  l-418_46`, CONSTRAINT `payments_invoice_id_foreign` FOREIGN KEY (`invoice_id`) REFERENCES `invoices` (`id`) ON DELETE CASCADE)       

谁能帮帮我?

【问题讨论】:

  • 你想要什么?你想迁移数据库中的表吗?
  • 它给了我这个异常 [Illuminate\Database\QueryException] SQLSTATE[23000]:完整性约束违规:1217 无法删除或更新父行:外键约束失败(SQL:删除表 @987654324 @)
  • 试试这个pastebin.com/9dbGFPY3

标签: mysql laravel database-migration invoice-ninja


【解决方案1】:

我假设您正在运行 down 方法。第一行:

$table->unsignedInteger('invoice_id')->index();

添加列,我不知道 Laravel,但我猜这会为该列分配一个默认值 0

$table->foreign('invoice_id')->references('id')->on('invoices')->onDelete('cascade');

如果引用的 id 列中没有 0 值,则会失败。

您可以通过将invoice_id 列为NULL 并将其用作默认值来实现此功能。

我的第一站是检查新添加的列 invoice_id 中的值。

【讨论】:

    【解决方案2】:

    我不知道你为什么在 down() 方法中有这个逻辑,因为通常它在 up() 中,但尝试这样做:

    public function down()
    {
        Schema::table('payments', function (Blueprint $table){
            $table->unsignedInteger('invoice_id')->index();
        });
    
        Schema::table('payments', function (Blueprint $table){
            $table->foreign('invoice_id')->references('id')->on('invoices')->onDelete('cascade');
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 2021-07-23
      • 2015-11-27
      • 2012-06-14
      • 2019-04-12
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多