为什么复合主键允许空值但不允许空值

问题描述 投票:0回答:2

我正在开发一个连接到 Snowflake 数据库的应用程序。我在加载 CSV 文件时偶然发现了一个问题。如果在加载过程中遇到任何空值,我在copy命令中使用NULL_IF条件将列值更改为null

经过调查,我发现其中一列是复合主键的一部分,并且该列的值在几行中为空。删除 NULL_IF 条件后,它开始正常工作。

为什么复合主键允许空值但不允许空值?

我搜索了很多,但所有答案都试图解释为什么复合键列不能有空值,这有些道理。但为什么空值被认为是合法的呢?有人可以解释一下吗?谢谢

示例:

CREATE TABLE table_employee (
    column1 Varchar2(255),
    column2 Varchar2(255),
    column3 Varchar2(255),
    primary key (column1, column2)
   ....
);

以下插入将会成功:

INSERT INTO table_employee(column1, column2, column3, ...)
VALUES ('', 'abc', '', ...);

以下插入将失败:

INSERT INTO table_employee(column1, column2, column3, ...)
VALUES (null, 'abc', '', ...);
sql database snowflake-cloud-data-platform primary-key composite-key
2个回答
2
投票

为什么空值被认为是合法的

空字符串和 NULL 值

空字符串是长度为零或没有字符的字符串,而NULL 值表示缺少数据。

因此空字符串在概念上与

NULL
不同。


0
投票

我将尝试解决为什么 Snowflake DB 中的复合主键允许空值但禁止 NULL 值。

首先,我们需要了解 NULL 与空值:

  • NULL: 表示缺失或未知值。它不同于任何其他值,包括其自身(NULL = NULL 计算结果为 false)。
  • 空值:表示内容为零的值,但它仍然是已知值。例子: 空字符串 ("")、数字零 (0)、空日期 ("0001-01-01")

- 造成差异的关键原因

  1. 主键明确标识表中的每一行。NULL的不确定性使其不适合精确标识。
  2. 复合主键保证多列的唯一性。 NULL 的不明确性质可能会导致这些列中的多行具有 NULL 值,从而违反唯一性。
  3. 外键引用其他表中的主键。在主键中允许 NULL 可能会危及引用完整性,因为 NULL 外键不会明确链接到特定行。
  4. Snowflake 处理列空的能力。定义主键时,即使没有显式指定,Snowflake 也会隐式将所有涉及的列设置为 NOT NULL。

我的 2 美分:虽然技术上允许在复合主键中使用空字符串,但它们的使用通常表明潜在的数据质量问题或设计缺陷。 通常建议尽可能避免主键中出现空值。

© www.soinside.com 2019 - 2024. All rights reserved.