UNIQUE 与 UNIQUE ALL 的区别

2024 年 8 月 28 日 | 3 分钟阅读

引言

当我们谈论 **SQL** 中的唯一性时,我们通常使用 **UNIQUE** 约束来确保表中的一列或多列的组合具有唯一值。然而,**UNIQUE** ALL 是一种概念化,它意味着强调在一组列的组合中的唯一性。

UNIQUE

SQL UNIQUE 语句确保在数据库的所有行中,指定列或列组合的所有值都是独特的。这意味着没有两行可以在 UNIQUE 约束指定的列中具有相同的值。避免重复对于确保数据完整性非常重要。

示例

假设您希望确保每个产品在 order_items 数据库的每个订单中只出现一次。您可以将一个复合 UNIQUE 约束应用于 order_id 和 product_id 的组合。

在此示例中

  • order_id 和 product_id 的组合必须是唯一的。
  • 这确保了特定产品在每个订单中只能列出一次。

第一次插入:成功。

第二次插入:由于 UNIQUE 约束冲突而失败。

UNIQUE ALL

如果在 SQL 数据库中使用 UNIQUE ALL,它将强调唯一性约束适用于列的组合,保证这些列的值是唯一的。这类似于常规 SQL 中的复合 UNIQUE 约束。

示例

考虑以下实际示例:我们希望确保在 order_items 表中,每个产品在每个订单中只出现一次。我们将对 order_id 和 product_id 列使用复合 UNIQUE 约束。

在此示例中

  • order_id 和 product_id 必须是唯一的。
  • 这可以防止同一个产品在同一个订单中被列出多次。

第一次插入

此插入成功,因为 order_id 和 product_id 是唯一的。

第二次插入

此插入因 order_id 已存在而失败,并出现错误。

第三次插入

此插入因 order_id 和 product_id 的组合 (1, 101) 已存在而失败,并出现错误。

错误信息

当尝试第三次插入时,数据库会返回一条错误消息,表明违反了唯一性约束。

差异

参数UNIQUEUNIQUE ALL
目的确保表中的单个列或一组列的值是不同的。假设,跨定义列的所有值组合在表中必须是不同的。
标准化所有主要的数据库系统都提供标准的 SQL 功能。它不是主流 SQL 的一部分,在数据库系统中的使用频率不高。
用途通常用于对特定列或列组施加唯一性限制。由于其概念性和在大多数数据库系统中缺乏支持,因此仅有时使用。
语法直接应用于列的约束。一种概念性的语法,强调复合唯一性,并且不被 SQL 语法支持。
错误处理当尝试将重复值插入到给定的列中时,将返回错误消息。如果支持,尝试将指定列中的重复值组合插入将导致错误。
复合唯一性使用复合键,您可以保证跨多个列的唯一性。概念上强调复合唯一性,但鉴于 UNIQUE 的能力,这是不必要的。
实际实现在数据库设计中广泛实现和使用,以确保数据完整性。由于复合 UNIQUE 约束的存在,这并不常用。
文档SQL 标准和数据库文档都有充分的文档记录。它没有被记录,因为它不是一个典型的 SQL 功能。
索引创建自动生成索引以强制执行唯一性限制。为了确保复合唯一性,将在列组合上创建索引。
数据完整性通过避免在特定列或列组合中出现重复条目来确保数据完整性。如果启用,UNIQUE ALL 将通过禁止重复值组合来确保数据完整性。