deleted_at 为 NULL 的复合约束

Composite constraint where deleted_at is NULL

我需要在 Laravel 中进行复合约束,它只考虑非软删除行。因此,如果实体被删除,deleted_atnot null 并且 data_1data_2data_3data_4data_5 可以重新插入。

我能想到的最好的是这个(tablecolumn 名称是在以前的迁移中定义的):

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