我有一张如下表:
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)来实现它?
我记得读过这篇关于数据库设计的文章,我还记得它说你应该有 NOT NULL 的字段属性。我不记得为什么会这样。
我似乎只能想到,作为应用程序开发人员,您不必测试 NULL和可能不存在的数据值(例如,字符串的空字符串)。
但是对于日期、日期时间和时间 (SQL Server 2008),您会怎么做?你必须使用一些历史或触底的日期。
对此有何想法?
我正在使用 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,代码仍会读取第三个参数(即使不会使用它)。
我主要对 MySQL 和 PostgreSQL 感兴趣,但您可以大致回答以下问题:
将空字符串存储为...的物理存储含义是什么?
我似乎记得(在 Oracle 上) utteringselect count(*) from any_table和select count(any_non_null_column) from any_table.
如果有的话,这两个陈述之间有什么区别?
我有一个包含 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
我正在BBC 上阅读这篇文章。它讲述了一个名叫 Jenifer Null 的人的故事,以及她在使用在线数据库(如预订机票、网上银行等)时如何面对日常问题。
我不精通数据库,也不经常使用它。我在做学习网站的时候,服务器端表单验证使用了正则表达式。据我所知,它很乐意接受“Null”这个名字。我还没有尝试过。
有人可以解释这种情况发生时的技术细节吗?表单验证只是在string == NULL做某事吗?即使这样我也不认为NULL is same as "NULL"。
在 MySQL 中,最好总是允许空值,除非你知道一个字段是必需的,还是总是使用Not Null除非你知道一个字段将包含空值?还是没关系?
我知道在某些 DBMS 中,他们说要Not Null尽可能多地使用,因为允许空值需要每条记录额外的位(或字节?)来存储空状态。
从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?
null database-design sql-server constraint unique-constraint
的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 ×10
sql-server ×3
aggregate ×2
constraint ×2
alter-table ×1
coalesce ×1
count ×1
empty-string ×1
mysql ×1
oracle ×1
postgresql ×1
sql-standard ×1