【问题标题】:What are database constraints? [closed]什么是数据库约束? [关闭]
【发布时间】:2011-02-03 23:21:03
【问题描述】:

什么是明确的数据库约束定义?为什么约束对数据库很重要?约束的类型有哪些?

【问题讨论】:

  • 这个问题有明确的答案。它不是“太宽泛”。它的大量支持和收藏表明它对许多人有多么有用。我已经清理了措辞并提名它重新开放。
  • @BasilBourque 这个问题非常不适合程序员 - 它会很快被否决并关闭,请参阅meta.programmers.stackexchange.com/questions/6483/… 推荐阅读:@987654322 @
  • @gnat 虽然该页面让我仍然对 Programmers Stack Exchange 的主题是什么或不是主题一无所知,但我可以理解并同意发布作者首先阅读的最低阈值directly-relevant Wikipedia article 提供在 Stack Exchange 上请求的相同类型的简明或摘要概述。
  • 标题很宽泛,子问题是同时提出多个问题-_- TomTom、Pரதீப்、greg-449、bummi 和 Nit 想要它吗?请解释。无论如何,您可以询问约束吗...?
  • 虽然我理解对问题过于板和基于意见的情绪,但我不同意首先阅读维基百科文章的要求。它不提供“相同类型的浓缩或摘要概述”。接受的答案比上面的维基百科链接提供了更简洁和准确的答案。

标签: sql sql-server constraints rdbms


【解决方案1】:

约束是数据库架构定义的一部分。

约束通常与表相关联,并使用CREATE CONSTRAINTCREATE ASSERTION SQL 语句创建。

它们定义了数据库中的数据必须遵守的某些属性。它们可以应用于一列、整个表、多个表或整个模式。可靠的数据库系统可确保约束始终保持不变(可能在事务内部除外,即所谓的延迟约束)。

常见的约束类型有:

  • not null - 列中的每个值都不能为 NULL
  • 唯一 - 指定列中的值对于表中的每一行必须是唯一的
  • 主键 - 指定列中的值对于表中的每一行必须是唯一的,并且不能为 NULL;通常数据库中的每个表都应该有一个主键 - 它用于识别单个记录
  • 外键 - 指定列中的值必须引用另一个表中的现有记录(通过它的主键或其他一些唯一约束 em>)
  • check - 指定了一个表达式,它必须评估为真才能满足约束

【讨论】:

  • +1 表示包含 PK,不为空,为空
  • +1,您仍然可以扩展 FOREIGN KEY 场景并提供一些链接。
  • 检查约束不得评估为假。他们不必是真的。未知也很好。
  • 类型约束不也是一种常见的类型吗?
  • 虽然我们通常不称它们为约束,但我认为数据类型是一种约束形式。如果我将某些内容定义为 Int 或日期时间,则会限制可以放入该字段的数据类型。正确选择数据类型是确保数据完整性的关键部分。
【解决方案2】:

要了解我们为什么需要约束,您必须首先了解数据完整性的价值。

数据完整性是指数据的有效性。你的数据有效吗?您的数据是否代表了您设计它们的目的?

我问你什么奇怪的问题你可能会想,但遗憾的是,数据库经常充满垃圾数据,对其他表中行的无效引用,这些早已不复存在......以及对任何意义都没有任何意义的值您的解决方案的业务逻辑不再存在。

所有这些垃圾不仅容易降低您的性能,而且还是应用程序逻辑下的定时炸弹,最终会检索到它无法理解的数据。

约束是您在设计时创建的规则,可保护您的数据不被损坏。数据库解决方案对于您的心脏孩子的长期生存至关重要。如果没有限制,您的解决方案肯定会随着时间和大量使用而衰减。

您必须承认,设计数据库设计只是解决方案的诞生。在此之后,它必须(希望)存活很长时间,并忍受其最终用户(即客户端应用程序)的各种(奇怪)行为。但是,开发中的这个设计阶段对于您的解决方案的长期成功至关重要!尊重它,并付出它需要的时间和注意力。

一位智者曾经说过:“数据必须保护自己!”。这就是约束的作用。正是规则使数据库中的数据尽可能有效。

有很多方法可以做到这一点,但基本上可以归结为:

  • 外键约束可能是最常用的约束, 并确保引用其他 只有在有表的情况下才允许使用表 实际上存在一个目标行 参考。这也使它 不可能打破这样的 通过删除关系 引用的行创建了一个死链接。
  • 检查约束可以确保只允许特定的值 某列。您可以创建一个仅允许在 VARCHAR 列中出现“黄色”或“蓝色”字样的约束。所有其他值都会产生错误。查看 AdventureWorks 示例数据库中的 sys.check_constraints 视图,了解检查约束的用法
  • SQL Server 中的 Rules 只是可重用的检查约束(允许 你要从一个维护语法 单一的地方,并使其更容易 将您的约束部署到其他 数据库)

正如我在这里所暗示的,为您的数据库设计构建最佳和最具防御性的约束方法需要进行一些全面的考虑。您首先需要了解上述不同约束类型的可能性和限制。进一步阅读可能包括:

FOREIGN KEY Constraints - Microsoft

Foreign key constraint - w3schools

CHECK Constraints

祝你好运! ;)

【讨论】:

  • 作为一个死神评论,微软现在似乎正在排便规则。
【解决方案3】:

约束不过是数据的规则。可以使用约束来定义哪些数据是有效的,哪些是无效的。因此,可以保持数据的完整性。 以下是广泛使用的约束:

  1. 主键:唯一标识数据。如果为某个列指定了此约束,则我们不能在该列中输入重复数据
  2. 检查:如NOT NULL。在这里,我们可以指定我们可以为该特定列输入哪些数据,以及该列不需要输入哪些数据。
  3. 外键:外键引用其他表的行。因此,一个表中从另一个表引用的数据始终可用于引用表。

【讨论】:

    【解决方案4】:

    约束可用于强制执行数据的特定属性。一个简单的示例是将 int 列限制为值 [0-100000]。 This介绍看起来不错。

    【讨论】:

      【解决方案5】:

      约束规定哪些值对数据库中的数据有效。例如,您可以强制 a 值不为空(NOT NULL 约束),或者它作为唯一约束存在于另一个表中(FOREIGN KEY 约束),或者它在该表中是唯一的(@987654325 @ 约束或 PRIMARY KEY 约束,具体取决于您的要求)。可以使用CHECK 约束来实现更一般的约束。

      MSDN documentation for SQL Server 2008 constraints 可能是您最好的起点。

      【讨论】:

        【解决方案6】:
        1. UNIQUE 约束(其中PRIMARY KEY 约束是一个变体)。检查给定字段的所有值在表中是否唯一。这是X-axis 约束(记录)

        2. CHECK 约束(其中 NOT NULL 约束是一个变体)。检查某个条件是否适用于同一记录的字段上的表达式。这是Y-axis 约束(字段)

        3. FOREIGN KEY 约束。检查是否在另一个表的字段值中找到了字段值。这是Z-axis 约束(表格)。

        【讨论】:

        • 唯一约束和外键约束可以使用CHECK约束来编写,那么为什么要将它分类为不同呢?即“Y-axis”(无论是什么意思)。
        • @onedaywhen:如何使用CHECK 约束实现FOREIGN KEY
        • @onedaywhen:尝试使用此约束创建表。
        • @onedaywhen:尝试有那么难吗?提示:这行不通。
        • @onedaywhen:您编写的查询不会创建检查约束。这只是一个SELECT 查询。您不能在SQL Server 中的CHECK 约束中使用子查询(或任何其他引用当前记录之外的值的构造)。
        【解决方案7】:

        数据库是概念(或业务)模型的计算机化逻辑表示,由一组非正式的业务规则组成。这些规则是用户理解的数据含义。因为计算机只能理解形式表示,所以业务规则不能直接在数据库中表示。它们必须映射到一个正式的表示,一个逻辑模型,它由一组完整性约束组成。这些约束——数据库模式——是数据库中业务规则的逻辑表示,因此是 DBMS 理解的数据含义。因此,如果 DBMS 不知道和/或不强制执行代表业务规则的完整约束集,则它对数据的含义有不完整的理解,因此无法通过防止损坏来保证 (a) 其完整性, (b) 它从中得出的推论的完整性(即查询结果)——这是另一种说法,即 DBMS 充其量是不完整的。

        注意:DBMS-“理解”的含义——完整性约束——与用户理解的含义——业务规则——并不完全相同,但是,尽管失去了一些含义,我们还是获得了从数据中机械化逻辑推理的能力。

        Fabian Pascal 的“老类错误”

        【讨论】:

          【解决方案8】:

          SQL 中的主要约束基本上有 4 种类型:

          • 域约束:如果为新的属性值之一提供 元组不属于指定的属性域

          • Key Constraint:如果新元组中的关键属性值 已经存在于关系中的另一个元组中

          • 参照完整性:如果新元组中的外键值 引用了被引用的主键值不存在 关系

          • 实体完整性:如果新元组中的主键值为空

          【讨论】:

            【解决方案9】:

            约束是条件,可以验证特定条件。 与数据库相关的约束有域完整性、实体完整性、参照完整性、用户定义的完整性约束等。

            【讨论】:

              猜你喜欢
              • 2011-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-30
              • 2021-09-04
              • 1970-01-01
              相关资源
              最近更新 更多