Laravel-没有唯一的约束匹配引用表的给定键-使用多个unique
我在Postgres 7.2中遇到了这个错误: 无效的外键:7错误:没有唯一的约束匹配引用表“假日项目”的给定键(SQL:alter table“假日预订”添加约束“假日项目”\u父假日项目\u id\u外键(“父假日项目\u id”)在删除级联上引用“假日项目”(“id”)) 以下是我正在尝试运行的迁移: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')->
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');