gpt4 book ai didi

symfony - ORM UniqueConstraint,空值重复

转载 作者:行者123 更新时间:2023-12-02 20:53:52 25 4
gpt4 key购买 nike

我有一个对 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"})})

编辑:可为空值是其他实体的外键,因此我无法放置自定义值。它是一个实体或 null。

最佳答案

这可以使用 two partial indexes 来实现。但学说注释还不够。我们应该添加一些SQL来解决这个问题。

注意!我正在使用 PostgreSQL 和 migrations在我的项目中。

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

uniqueConstraints:
table_idx_2_fields:
columns: [ field1, field2 ]
table_idx_3_fields:
columns: [ field1, field2, field3 ]

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

php app/console doctrine:migrations:diff

将生成 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)
{
// ...
}
}

执行生成的 SQL(迁移):

php app/console doctrine:migrations:migrate -n

完成!

关于symfony - ORM UniqueConstraint,空值重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22808046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com