我在使用PostgreSQL的Pyramid Web应用程序中遇到SQLAlchemy约束问题。
我有一个可以处于不同状态的对象:
class Foo(Base):
# -1 - inactive
# 0 - in queue
# 1 - next
# 2 - active
state = Column(
Integer,
nullable=False
)
现在我想在活动状态下只有一个(或没有)对象,在下一个状态中只有一个(或没有)对象,并且对其他两个状态中有多少个对象应该没有限制。
我想创建一个约束或者作为约束的东西,如果已经有一个处于该状态的对象(并且对于下一个状态相同),则不允许将任何其他对象的状态更改为活动状态。
唯一约束不会在这里做,因为我只想要一些值是唯一的而不是所有的。 基本上我想要的是每当我提交一个事务时,有一种机制不允许事务被提交,如果它会破坏我写的约束。 我怎样才能做到这一点?
答案 0 :(得分:4)
PostgreSQL支持部分唯一索引。
CREATE UNIQUE INDEX foo_only_one_active ON foo(state) WHERE (state = 'active');
CREATE UNIQUE INDEX foo_only_one_active ON foo(state) WHERE (state = 'next');
将约束表格,使得只有一行可能具有“活动”或“下一个”状态。如果您愿意,可以将单个索引与state IN ('active', 'next')
一起使用,但我认为此表单更有可能真正用于state = 'active'
或state = 'next
'的查询。