【问题标题】:Is it necessary to make a uqiue indexed column not nullable (SQL, SQLAlchemy)?是否有必要使 uqiue 索引列不可为空(SQL、SQLAlchemy)?
【发布时间】:2019-12-28 10:56:45
【问题描述】:

不确定在哪里发布这个问题。是否有必要使唯一索引列不可为空,像这样(使用 SQLAlchemy):

name = db.Column(db.String(64), index=True, unique=True, nullable=False)  # <--

或者它可能是多余的并且该列无论如何不能为 NULL?唯一列可以为 NULL 吗?

【问题讨论】:

  • 这取决于数据库。例如,在 MySQL 中,您需要设置 nullable=Falsestackoverflow.com/questions/3712222/…。就 SQLA 本身而言,我不确定它是否具有标准化行为或仅依赖于底层库
  • 在许多同时具有index=Trueunique=True 的DBMS 中是多余的,因为使用唯一索引强制执行唯一约束。

标签: python sql sqlalchemy flask-sqlalchemy


【解决方案1】:

是的,唯一列可以为 NULL。如果你想控制它,你仍然需要使用nullable=False

如果您省略 nullable=False,则确切的行为取决于方言。有些将允许多个 NULL 值,而另一些则在测试唯一性时只允许一个 NULL。

首先我们可以看到下面from the source code

:param nullable:当设置为False时,将导致“NOT NULL” 为列生成 DDL 时要添加的短语。什么时候 True,通常不会生成任何东西(在 SQL 中默认为 "NULL"),除了一些非常特定的后端特定边缘情况 其中“NULL”可能会显式呈现。默认为True,除非 :paramref:~.Column.primary_key 也是True,在这种情况下它 默认为False。该参数仅在发出时使用 CREATE TABLE 语句。

我无法涵盖所有​​方言,但我的搜索似乎表明大多数方言允许在具有唯一约束的列中包含多个 NULL 条目,例如the SQLite FAQ 状态:

SQL 标准要求强制执行 UNIQUE 约束,即使约束中的一个或多个列为 NULL,但 SQLite 不这样做。这不是错误吗?

...

SQLite 遵循解释 (1),PostgreSQL、MySQL、Oracle、 和火鸟。 Informix 和 Microsoft SQL Server 确实使用 解释(2),但是我们 SQLite 开发人员认为 解释 (1) 是对要求的最自然的解读,并且 我们还希望最大限度地兼容其他 SQL 数据库 引擎,并且大多数其他数据库引擎也与(1)一起使用,因此 SQLite 是做什么的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2014-08-25
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多