deleted_at 为 NULL 的复合约束
Composite constraint where deleted_at is NULL
我需要在 Laravel 中进行复合约束,它只考虑非软删除行。因此,如果实体被删除,deleted_at
是 not null
并且 data_1
、data_2
、data_3
、data_4
、data_5
可以重新插入。
我能想到的最好的是这个(table
和 column
名称是在以前的迁移中定义的):
public function up()
{
Schema::table('table_name', function (Blueprint $table) {
$table->unique(['data_1', 'data_2', 'data_3', 'data_4', 'data_5'])
->whereNull('deleted_at');
});
}
但是没用。即使 deleted_at
为 not null
.
,该约束也适用
我一直在浏览其他 post 有类似问题的人,但他们的解决方案有不同的方法,与迁移无关。
事实证明,进行约束并不是解决问题的正确方法。
唯一索引允许使列的组合唯一,并且允许条件。
在原始 sql 语句中是:
public function up()
{
DB::statement('CREATE UNIQUE INDEX table_unique_preferredNameOfIndex ON schema.table
USING btree (data_1, data_2, data_3, data_4, data_5) WHERE (deleted_at IS NULL)');
}
不完全相同,但它完成了工作。
如果需要回滚,只需删除索引:
public function down()
{
DB::statement('DROP INDEX schema.table_unique_preferredNameOfIndex');
}
我需要在 Laravel 中进行复合约束,它只考虑非软删除行。因此,如果实体被删除,deleted_at
是 not null
并且 data_1
、data_2
、data_3
、data_4
、data_5
可以重新插入。
我能想到的最好的是这个(table
和 column
名称是在以前的迁移中定义的):
public function up()
{
Schema::table('table_name', function (Blueprint $table) {
$table->unique(['data_1', 'data_2', 'data_3', 'data_4', 'data_5'])
->whereNull('deleted_at');
});
}
但是没用。即使 deleted_at
为 not null
.
我一直在浏览其他 post 有类似问题的人,但他们的解决方案有不同的方法,与迁移无关。
事实证明,进行约束并不是解决问题的正确方法。
唯一索引允许使列的组合唯一,并且允许条件。
在原始 sql 语句中是:
public function up()
{
DB::statement('CREATE UNIQUE INDEX table_unique_preferredNameOfIndex ON schema.table
USING btree (data_1, data_2, data_3, data_4, data_5) WHERE (deleted_at IS NULL)');
}
不完全相同,但它完成了工作。
如果需要回滚,只需删除索引:
public function down()
{
DB::statement('DROP INDEX schema.table_unique_preferredNameOfIndex');
}