这可以通过使用来实现两个部分索引 https://stackoverflow.com/a/8289253。但学说注释还不够。我们应该添加一些SQL来解决这个问题。
笔记!我正在使用 PostgreSQL 和迁移 http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html在我的项目中。
首先创建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
Done!