使用SQLAlchemy在Postgres中强制实现多列唯一性约束

3

根据sqlalchemy unique across multiple columns的答案(我使用下面给出的声明版),我尝试声明一个多列唯一性约束。

class Location(Base):
    __tablename__ = 'locations'
    id = Column(Integer, primary_key = True)
    customer_id = Column(Integer, ForeignKey('customers.customer_id'), nullable=False)
    location_code = Column(Unicode(10), nullable=False)
    __table_args__ = (UniqueConstraint('customer_id', 'location_code', name='_customer_location_uc'),
                 )

然而,当我使用相同的customer_id和location_code创建多个项目时,SQLAlchemy不会产生任何唯一性异常,并且这些项目被成功创建。
在链接答案下面的评论中,有关于指定UniqueConstraint仅作为DDL的部分对话。我需要执行哪些其他操作才能强制执行此约束条件?

1
该死,我知道这是一些简单的东西。我的其中一列是可空的,而所有的空值都是唯一的!投票关闭,这对未来任何人都没有用... - Ng Oon-Ee
其实你的问题很好 - 其他人可能会发现它有用。能否分享一下你的发现来回答这个问题? - Patrick B.
注释已经解释了一切。所有的空值都被认为是唯一的。 - Ng Oon-Ee
是的,但评论不是答案,但您的评论是对您问题的回答,因此您应该将其作为答案。这就是Stackoverflow的好处。 - Patrick B.
1个回答

0

Postgres的约束不会强制一个字段只有一个空值:

https://www.postgresql.org/docs/9.4/ddl-constraints.html

需要注意的是,如果检查表达式评估为true或null值,则满足检查约束。由于大多数表达式如果任何操作数为null将评估为null值,因此它们不会阻止受限列中的null值。为确保列不包含null值,可以使用下一节中描述的非空约束。

因此,为使约束起作用,正如作者在自己的评论中指出的那样,将要约束的列设置为nullable=False

(感谢Ng Onne-Ee回答自己的问题,但认为明确的答案可能对其他人有帮助)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接