Python 是否有必要使uqiue索引列不可为空(SQL、SQLAlchemy)?
我不确定该把这个问题贴在哪里。是否有必要使唯一索引列不可为空,如以下所示(使用SQLAlchemy):Python 是否有必要使uqiue索引列不可为空(SQL、SQLAlchemy)?,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask Sqlalchemy,我不确定该把这个问题贴在哪里。是否有必要使唯一索引列不可为空,如以下所示(使用SQLAlchemy): name=db.Column(db.String(64),index=True,unique=True,nullable=False)#是的,唯一列可以为NULL。如果要控制此操作,您仍然需要使用nullable=False 如果省略nullable=False,则具体行为取决于方言。一些允许多个空值,其他的在测试唯一性时只允许一个空值 首先,我们可以看到以下几点 :param nullabl
name=db.Column(db.String(64),index=True,unique=True,nullable=False)#是的,唯一列可以为NULL。如果要控制此操作,您仍然需要使用nullable=False
如果省略nullable=False
,则具体行为取决于方言。一些允许多个空值,其他的在测试唯一性时只允许一个空值
首先,我们可以看到以下几点
:param nullable:当设置为False
时,将导致“NOT NULL”
为列生成DDL时要添加的短语。什么时候
True
,通常不会生成任何内容(在SQL中,默认为
“NULL”),但在某些非常特定于后端的边缘情况下除外
其中“NULL”可以显式呈现。默认值为True
,除非
:paramref:~.列。主键也是True
,在这种情况下
默认值为False
。此参数仅在发出时使用
创建表语句
我不能涵盖所有方言,但我的搜索似乎表明,大多数方言都允许在一列中有多个空条目,并具有唯一的约束条件,例如状态:
SQL标准要求强制执行唯一约束,即使约束中的一个或多个列为NULL,但SQLite
不这样做。这不是一个bug吗?
SQLite遵循解释(1),PostgreSQL、MySQL、Oracle、,
还有火鸟。Informix和Microsoft SQL Server使用
解释(2),但是我们SQLite开发人员认为
解释(1)是对需求和需求的最自然的解读
我们还希望最大限度地提高与其他SQL数据库的兼容性
引擎和大多数其他数据库引擎也使用(1),因此
SQLite的功能
是,唯一列可以为空。如果要控制此操作,您仍然需要使用nullable=False
如果省略nullable=False
,则具体行为取决于方言。一些允许多个空值,其他的在测试唯一性时只允许一个空值
首先,我们可以看到以下几点
:param nullable:当设置为False
时,将导致“NOT NULL”
为列生成DDL时要添加的短语。什么时候
True
,通常不会生成任何内容(在SQL中,默认为
“NULL”),但在某些非常特定于后端的边缘情况下除外
其中“NULL”可以显式呈现。默认值为True
,除非
:paramref:~.列。主键也是True
,在这种情况下
默认值为False
。此参数仅在发出时使用
创建表语句
我不能涵盖所有方言,但我的搜索似乎表明,大多数方言都允许在一列中有多个空条目,并具有唯一的约束条件,例如状态:
SQL标准要求强制执行唯一约束,即使约束中的一个或多个列为NULL,但SQLite
不这样做。这不是一个bug吗?
SQLite遵循解释(1),PostgreSQL、MySQL、Oracle、,
还有火鸟。Informix和Microsoft SQL Server使用
解释(2),但是我们SQLite开发人员认为
解释(1)是对需求和需求的最自然的解读
我们还希望最大限度地提高与其他SQL数据库的兼容性
引擎和大多数其他数据库引擎也使用(1),因此
SQLite的功能
这取决于数据库。例如,在MySQL中,需要设置nullable=False
。就SQLA本身而言,我不确定它是否具有标准化的行为,还是仅仅依赖于基础库。在许多数据库管理系统中,同时具有index=True
和unique=True
是冗余的,因为唯一约束是使用唯一索引强制执行的。这取决于数据库。例如,在MySQL中,需要设置nullable=False
。就SQLA本身而言,我不确定它是否具有标准化的行为,或者仅仅依赖于基础库。在许多数据库管理系统中,同时具有index=True
和unique=True
是冗余的,因为使用唯一索引强制执行唯一约束。