标签: null

PostgreSQL 多列唯一约束和 NULL 值

我有一张如下表:

create table my_table (
    id   int8 not null,
    id_A int8 not null,
    id_B int8 not null,
    id_C int8 null,
    constraint pk_my_table primary key (id),
    constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)

我想(id_A, id_B, id_C)在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:

INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)

但它没有按预期运行,因为根据文档,两个NULL值不会相互比较,因此两个插入都没有错误地通过。

我怎么能保证我的唯一约束,即使id_C可以NULL在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?

postgresql null constraint unique-constraint

137
推荐指数
3
解决办法
13万
查看次数

为什么我们不应该允许 NULL?

我记得读过这篇关于数据库设计的文章,我还记得它说你应该有 NOT NULL 的字段属性。我不记得为什么会这样。

我似乎只能想到,作为应用程序开发人员,您不必测试 NULL可能不存在的数据值(例如,字符串的空字符串)。

但是对于日期、日期时间和时间 (SQL Server 2008),您会怎么做?你必须使用一些历史或触底的日期。

对此有何想法?

null database-design

134
推荐指数
7
解决办法
6万
查看次数

即使第一个参数不为 NULL,SQL Server 是否会读取所有 COALESCE 函数?

我正在使用 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间不会为空。如果第一个参数是NULL,第二个参数是一个相当漫长的过程:

SELECT COALESCE(c.FirstName
                ,(SELECT TOP 1 b.FirstName
                  FROM TableA a 
                  JOIN TableB b ON .....)
                )
Run Code Online (Sandbox Code Playgroud)

例如,如果 ,c.FirstName = 'John'SQL Server 仍会运行子查询吗?

我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使不会使用它)。

null sql-server coalesce

102
推荐指数
6
解决办法
2万
查看次数

何时使用 NULL,何时使用空字符串?

我主要对 MySQL 和 PostgreSQL 感兴趣,但您可以大致回答以下问题:

  • 是否存在区分空字符串和 NULL 有用的逻辑场景?
  • 将空字符串存储为...的物理存储含义是什么?

    • 空值?
    • 空字符串?
    • 另一个领域?
    • 还有什么办法吗?

null empty-string feature-comparison

100
推荐指数
5
解决办法
10万
查看次数

select count(*) 和 select count(any_non_null_column) 有什么区别?

我似乎记得(在 Oracle 上) utteringselect count(*) from any_tableselect count(any_non_null_column) from any_table.

如果有的话,这两个陈述之间有什么区别?

null oracle aggregate count

60
推荐指数
3
解决办法
4万
查看次数

为什么 ALTER COLUMN 为 NOT NULL 会导致大量日志文件增长?

我有一个包含 64m 行的表,在磁盘上占用了 4.3 GB 的数据。

每行大约有 30 个字节的整数列,加上一个NVARCHAR(255)用于文本的变量列。

我添加了一个带有 data-type 的 NULLABLE 列Datetimeoffset(0)

然后我为每一行更新了这一列,并确保所有新的插入都在这一列中放置了一个值。

一旦没有 NULL 条目,我就运行这个命令来使我的新字段成为强制性的:

ALTER TABLE tblCheckResult 
ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL
Run Code Online (Sandbox Code Playgroud)

结果是事务日志大小大幅增长——从 6GB 增加到超过 36GB,直到空间用完!

有没有人知道 SQL Server 2008 R2 到底在为这个简单的命令做些什么来导致如此巨大的增长?

null sql-server sql-server-2008-r2 alter-table transaction-log

58
推荐指数
3
解决办法
4万
查看次数

如果一个人的名字是 Null 那么它会如何破坏数据库?

我正在BBC 上阅读这篇文章。它讲述了一个名叫 Jenifer Null 的人的故事,以及她在使用在线数据库(如预订机票、网上银行等)时如何面对日常问题。

我不精通数据库,也不经常使用它。我在做学习网站的时候,服务器端表单验证使用了正则表达式。据我所知,它很乐意接受“Null”这个名字。我还没有尝试过。

有人可以解释这种情况发生时的技术细节吗?表单验证只是在string == NULL做某事吗?即使这样我也不认为NULL is same as "NULL"

null database-agnostic

56
推荐指数
5
解决办法
2万
查看次数

默认情况下为 NULL 还是 NOT NULL?

在 MySQL 中,最好总是允许空值,除非你知道一个字段是必需的,还是总是使用Not Null除非你知道一个字段将包含空值?还是没关系?

我知道在某些 DBMS 中,他们说要Not Null尽可能多地使用,因为允许空值需要每条记录额外的位(或字节?)来存储空状态。

mysql null

41
推荐指数
2
解决办法
2万
查看次数

为什么 UNIQUE 约束只允许一个 NULL?

从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?

null database-design sql-server constraint unique-constraint

37
推荐指数
2
解决办法
5万
查看次数

为什么 ANSI SQL 将 SUM(无行)定义为 NULL?

ANSI SQL标准定义(第6.5章,集功能规范),用于空的结果集的集合函数以下行为:

COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Run Code Online (Sandbox Code Playgroud)

为 AVG、MIN 和 MAX 返回 NULL 非常有意义,因为空集的平均值、最小值和最大值是未定义的。

然而,最后一个让我感到困扰:在数学上,空集的 SUM 是明确定义的:0。使用 0,加法的中性元素,作为基本情况使一切保持一致:

SUM({})        = 0    = 0
SUM({5})       = 5    = 0 + 5
SUM({5, 3})    = 8    = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Run Code Online (Sandbox Code Playgroud)

定义SUM({})null基本上使“无行”成为不适合其他行的特殊情况:

SUM({})     = NULL  = NULL
SUM({5})    = 5    != …
Run Code Online (Sandbox Code Playgroud)

null aggregate relational-theory sql-standard

30
推荐指数
1
解决办法
7131
查看次数