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)
编辑:可为空值是其他实体的外键,所以我不能放置自定义值。它是一个实体或空值。
这可以使用两个部分索引来实现。但学说注释还不够。我们应该添加一些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)并在新列上添加唯一约束并删除现有约束。
| 归档时间: |
|
| 查看次数: |
2053 次 |
| 最近记录: |