ORM UniqueConstraint,空值重复

Clé*_*aud 5 orm unique-constraint symfony

我有一个对 3 个字段具有唯一约束的实体。

2 个字段不可为空,第三个字段可以为空。

我的问题,当第三个字段为空时,唯一约束不起作用,所以我可以在我的数据库中有一些重复的值,比如 (5,1,null)(5,1,null)

对我来说, (5,1,null)是一个独特的值,也有 null。

你有什么想法 ?

这是我的 ORM 线:

* @ORM\Table(name="table", uniqueConstraints={@ORM\UniqueConstraint(name="table_idx", columns={"field1", "field2", "field3"})})
Run Code Online (Sandbox Code Playgroud)

编辑:可为空值是其他实体的外键,所以我不能放置自定义值。它是一个实体或空值。

Jek*_*kis 6

这可以使用两个部分索引来实现。但学说注释还不够。我们应该添加一些SQL来解决这个问题。

笔记!我在我的项目中使用 PostgreSQL 和迁移

首先创建2个唯一索引(我使用YAML):

uniqueConstraints:
    table_idx_2_fields:
        columns: [ field1, field2 ]
    table_idx_3_fields:
        columns: [ field1, field2, field3 ]
Run Code Online (Sandbox Code Playgroud)

然后使用控制台生成迁移类:

php app/console doctrine:migrations:diff
Run Code Online (Sandbox Code Playgroud)

将生成 SQL,但必须稍作修改(添加 WHERE 子句

class Version20170622165834 extends AbstractMigration
{
    /**
     * @param Schema $schema
     */
    public function up(Schema $schema)
    {
        // ...

        $this->addSql('
            CREATE UNIQUE INDEX table_idx_2_fields ON tbl (field1, field2)
            WHERE field3 IS NULL;
        ');
        $this->addSql('
            CREATE UNIQUE INDEX table_idx_3_fields ON tbl (field1, field2, field3)
            WHERE field3 IS NOT NULL;
        ');
    }

    /**
     * @param Schema $schema
     */
    public function down(Schema $schema)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

执行生成的 SQL(迁移):

php app/console doctrine:migrations:migrate -n
Run Code Online (Sandbox Code Playgroud)

完毕!


小智 3

我也遇到了同样的问题,没有找到任何方法来解决它。

最后在我的表中又添加了一个 varchar 列,它的值是 3 个字段的组合。ex:5_1_0(手动检查并添加 0 为空约束,否则约束 Id)并在新列上添加唯一约束并删除现有约束。