在为新数据仓库开发ETL管道时,我遇到了与零值有关的意外查询结果。这促使我深入研究了基本的SQL行为,以更好地了解差异。在本文中,我旨在通过独特而独特的关键字来阐明对零的对比处理。我将根据对数据仓库的分析介绍示例。
独特:将无效视为等效性
当我试图探索特定列中的类别或值范围时,例如,“作业”列的初始结果如下:
[doctor, engineer, ..., null]
这个结果提出了一个问题:这是否意味着只有一个空值?我以前对PostgreSQL的理解使我相信无效的价值是不同的。但是,当我精心计算使用查询“作业”列中null值的出现时:
SELECT COUNT(*) as nulljobs FROM jobs WHERE jobs IS NULL;
结果揭示了一个令人惊讶的140行,其中包含空值。看来独特的零值是等效的。对于这种行为,可能有一个合理的解释。通常采用独特的操作进行可视化或分类目的。因此,将无效视为独特的可能是没有实际意义的。但是,这提出了一个问题,即为什么首先将无效视为不同的值。
这种处理源于三值逻辑(3VL)的概念,该逻辑由真实,错误和未知。至关重要的是,在这种情况下,“未知”并不等于“未知”。请记住,比较“未知!=未知”。为了阐明这一点,请考虑无穷大 +无穷大等于无穷大。这意味着未知值可以汇总为单个值或类别。
独特的约束:确保列之间的独特性
在PostgreSQL中唯一约束下,无效值的行为引入了有趣的细微差别。独特的约束尤其是针对部分索引的量身定制的。在这种特定情况下,对零值的解释显着不同。在唯一约束下,无效的值并没有用作均值或中心趋势的指标,它体现了一排其他非零值的独特性。结果,独特的约束并非围绕隔离值的处理。相反,他们专注于在单个行中包含的值之间保持区分。
为了进一步说明这一点,让我们考虑一个涉及PostgreSQL数据库的实用场景:
假设我们有一个名为“员工”列的表“员工”和“电子邮件”。我们要确保“电子邮件”列中的每个电子邮件地址都是唯一的。但是,零值不应干扰这种唯一性要求。
CREATE TABLE employees (
employee_id serial PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
-- Create a partial index to enforce uniqueness among non-null ids
CREATE UNIQUE INDEX unique_email
ON employees (email)
WHERE email IS NOT NULL;
在这种情况下,PostgreSQL将在“电子邮件”列上执行唯一约束,从而允许多个空值。这与以下概念一致:独特的约束主要与保持非零值的独特性有关。
例如,以下插入有效:
-- Valid insertions
INSERT INTO employees (email) VALUES ('john@example.com');
INSERT INTO employees (email) VALUES ('mary@example.com');
INSERT INTO employees (email) VALUES (NULL);
但是,尝试插入重复的非零值将导致违反独特的约束:
-- Invalid insertion due to violation of UNIQUE constraint
INSERT INTO employees (email) VALUES ('john@example.com');
当您使用已经与Divell的部分索引选择一些信息时,它正在执行索引扫描。
EXPLAIN SELECT * FROM employees WHERE email IS NOT NULL;
摘要和结论
当然,我可以帮助您为您的文章撰写摘要和结论。这是结束您的文章的可能方法:
摘要和结论
- 不同的允许在结果集中重复零,因为它将零作为代表未知或丢失数据的不同值。此行为基于SQL的三值逻辑,其中未知不等于未知。
- 唯一的约束将null视为平等,因为它们在列或一组列中的非零值之间强制执行唯一性。此行为对于创建从索引中排除空值的部分索引很有用。
- 独特与唯一之间的差异会影响查询性能和数据完整性,因为它会影响数据的过滤,分类和索引。开发人员应意识到这种差异,并使用适当的技术来处理其查询中的零值。