当前位置: 首页 > 面试题库 >

SQLite的NULL和唯一的?

苏高峰
2023-03-14
问题内容

我注意到在具有UNIQUE约束的列中可以有NULL值: UNIQUE(col)

在某些情况下会产生任何问题吗?


问题答案:

尽管以下内容解决了多个空值,但除了可能的数据库/ SQL可移植性之外,它 没有 解决与这种设计相关的任何“问题”,因此,它可能
应该被视为答案,在此仅作参考。

这实际上在SQLite常见问题解答中进行了介绍。这是一种设计选择-SQLite(与SQL Server不同)选择了多个NULL值 计入索引的唯一性。

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

也许您是指SQL92中的以下语句:

  • 当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束。

该声明含糊不清,至少有两种可能的解释:

  1. 当且仅当表中没有两行具有相同的值且唯一列中具有非空值时,才满足唯一约束。

  2. 当且仅当表中没有两行在不为null的唯一列的子集中具有相同的值时,才满足唯一约束。

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

请参见NULL处理的比较。



 类似资料:
  • 问题内容: 下面是我的代码,我只想显示我在sqlite数据库中插入的数据到文本视图,但是我遇到这个错误,说id不是唯一的。 这是我的整个Java代码。谢谢 :) 问题答案: 好吧,我认为这个项目在您首次运行时效果很好。当您第二次运行它时,由于是您的ID为1的行已被插入到您的数据库中,因此会出现错误。 要消除错误,请执行以下任一操作:

  • 问题内容: 我试图创建一个表,我需要它不允许3个字段相同的行。 当我使用SQLLite在Python中创建表时,使用了以下代码,但几乎没有得到任何结果。它通常在写入2条记录后停止,因此显然可以相信它是重复的。 因此,我希望数据库不允许在ownerID1,ownerID2,accountKey和argID1相同的记录。 谁能帮我这个忙吗? 谢谢! 问题答案: 我不确定是什么问题。它在这里工作正常:

  • 问题内容: 这个问题需要一些假设的背景。让我们考虑一个有列的表,,,,使用MySQL作为RDBMS。由于如果给定的某个人的名字和出生日期与另一个人相同,那么根据定义,他们就是同一个人(除非有两个巧合,即我们两个人分别于1809年2月12日出生,他们叫亚伯拉罕·林肯),所以我们将上的唯一键,这意味着“不要将同一个人存储两次”。现在考虑以下数据: 如果现在尝试运行以下语句,则该语句应该并且将失败: 如

  • 主要内容:语法,实例SQLite 的 NULL 是用来表示一个缺失值的项。表中的一个 NULL 值是在字段中显示为空白的一个值。 带有 NULL 值的字段是一个不带有值的字段。NULL 值与零值或包含空格的字段是不同的,理解这点是非常重要的。 语法 创建表时使用 NULL 的基本语法如下: 在这里,NOT NULL 表示列总是接受给定数据类型的显式值。这里有两个列我们没有使用 NOT NULL,这意味着这两个列可以为

  • 我需要在表中插入所有单元格的唯一数据。我的表有3列,如果所有3个单元格的值相同,我需要忽略insert。 例如,我有一个表:|column_1 | column_2 | column_3| 以及此表的值: |val 1|val 2|val 3| |val 1|val 2|val 5| |val 1|val 2|val 3| |val 1|val 2|val 3| 所以我只需要插入值1和2,因为3和

  • 我有一个Postgres表,在多个列上有一个唯一的约束,其中一个可以为NULL。对于每个组合,我只希望允许该列中有一条空记录。 我有一个upsert查询,当它遇到col2、col3中具有相同值的记录时,我想更新col4: 但是当col3为空时,冲突不会触发。我读过关于使用触发器的文章。请问让冲突触发的最佳解决方案是什么?