【问题标题】:Enforcing multi-column uniqueness constraint in postgres using SQLAlchemy使用 SQLAlchemy 在 postgres 中强制执行多列唯一性约束
【发布时间】:2018-09-11 08:04:04
【问题描述】:

基于对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 获得任何唯一性异常,并且项目已成功创建。

在链接答案下方的 cmets 中,有一段关于将 UniqueConstraint 指定为 DDL 的一部分的部分对话。要强制执行此约束,我需要做的另一部分是什么?

【问题讨论】:

  • 该死,我知道这很简单。我的一列可以为空,并且所有空值都是唯一的!投票结束,这对将来的任何人都没有用...
  • 其实你的问题很好——其他人可能会觉得它很有用。介意用你的发现来回答吗?
  • 评论解释了一切,真的。假定所有空值都是唯一的。
  • 是的,但是评论不是答案,但您的评论是您问题的答案,因此您应该将其设为一个。 Stackoverflow 很好,正因为如此。

标签: postgresql sqlalchemy


【解决方案1】:

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

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

应该注意,如果检查表达式的计算结果为真或空值,则满足检查约束。由于如果任何操作数为空,大多数表达式将计算为空值,因此它们不会阻止受约束列中的空值。为确保列不包含空值,可以使用下一节中介绍的非空约束。

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

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

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2016-08-22
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多