0

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

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

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

4

1 回答 1

2

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

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

首先,我们可以从源代码中看到以下内容

:param nullable:设置为 时False,将导致在为列生成 DDL 时添加“NOT NULL”短语。When True, 通常不会生成任何内容(在 SQL 中,默认为“NULL”),除非在某些非常特定的后端特定边缘情况下,“NULL”可能会显式呈现。默认为True除非 :paramref: ~.Column.primary_keyis also True,在这种情况下它默认为False. 此参数仅在发出 CREATE TABLE 语句时使用。

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

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

...

SQLite 遵循解释 (1),PostgreSQL、MySQL、Oracle 和 Firebird 也是如此。Informix 和 Microsoft SQL Server 确实使用了解释 (2),但是我们 SQLite 开发人员认为解释 (1) 是对需求的最自然的解读,我们还希望最大限度地兼容其他 SQL 数据库引擎,以及大多数其他数据库引擎也与(1)一起使用,这就是 SQLite 所做的。

于 2019-12-28T11:32:20.453 回答