Laravel-没有唯一的约束匹配引用表的给定键-使用多个unique

Laravel-没有唯一的约束匹配引用表的给定键-使用多个unique,laravel,postgresql,migration,Laravel,Postgresql,Migration,我在Postgres 7.2中遇到了这个错误: 无效的外键:7错误:没有唯一的约束匹配引用表“假日项目”的给定键(SQL:alter table“假日预订”添加约束“假日项目”\u父假日项目\u id\u外键(“父假日项目\u id”)在删除级联上引用“假日项目”(“id”)) 以下是我正在尝试运行的迁移: Schema::create('holiday_bookings', function (Blueprint $table) { $table->uuid('id')->

我在Postgres 7.2中遇到了这个错误:

无效的外键:7错误:没有唯一的约束匹配引用表“假日项目”的给定键(SQL:alter table“假日预订”添加约束“假日项目”\u父假日项目\u id\u外键(“父假日项目\u id”)在删除级联上引用“假日项目”(“id”))

以下是我正在尝试运行的迁移:

Schema::create('holiday_bookings', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->uuid('booking_id')->index();
    $table->integer('booking_version')->index();
    $table->uuid('parent_holiday_item_id')->nullable();

    $table->unique(["id", "booking_id", "booking_version"]);

    $table->foreign('parent_holiday_item_id')->nullable()->references('id')->on('holiday_items')->onDelete('cascade');
    $table->foreign('quotation_id')->references('id')->on('quotations')->onDelete('cascade');

    $table->timestamps();
});
以下是
holiday\u items
表中带有unqiue约束的字段:

Schema::create('holiday_items', function (Blueprint $table) {
    $table->uuid('id');
    $table->integer('booking_version')->index();
    $table->uuid('booking_id')->index();
    $table->timestamps();

    $table->unique(["id", "booking_id", "booking_version"]);

    $table->foreign(['booking_version', 'booking_id'])->references([
        'booking_version',
        'id'
    ])->on('bookings')->onDelete('cascade');

});

holiday\u bookings
migration中的外键分配有什么问题?

这是因为您的
holiday\u items.id
列没有唯一的约束

修改如下:

Schema::create('holiday_items', function (Blueprint $table) {
    $table->uuid('id')->unique();
                      ^^^^^^^^^^
    // ..
});

您应该将id列设置为主键,这是该列获得唯一性的地方

在您的迁移中:

 $table->uuid('id');
  $table->primary('id');

在您的迁移中将不需要将此列设置为唯一列

您是否尝试对父项假日项目id字段使用onUpdate('cascade')?是否应在此处定义唯一约束:
$table->unique([“id”,“booking\u id”,“booking\u version]”)@f7n不是真的。唯一的约束是3列值的组合,这意味着您可以重复其中两个,并为组合设置第三个,使其仍然唯一。我刚刚测试了这一点,但它不是如何工作的。使用3列唯一常量和
id
字段上的
primary()
,我不能重复其中两个值,因为
id
上的唯一约束失败。@f7n是的,如果同时添加
primary()
子句,则该值必须是唯一的。请记住,在您的原始代码中并非如此,这就是为什么我在回答您的问题时对此进行了评论。实际上@f7n,另一个答案更准确。添加primary()删除了错误,但我不希望表仅在id上是唯一的,而是将
id
booking\u version
组合在一起。可能吗?这就是我添加这一行的原因:
$table->unique([“id”,“booking\u id”,“booking\u version]”)请参阅:我刚刚测试了这一点,将
primary()
添加到ID中也为字段添加了一个唯一的约束,但我需要能够添加具有相同
ID
但不同
预订版本的多个记录。我能做什么呢?您应该让主约束由多个列组成:$table->primary(['id','booking_versions');