什么是数据库约束?

时间:2010-04-03 09:22:57

标签: sql sql-server constraints rdbms

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

9 个答案:

答案 0 :(得分:106)

约束是数据库模式定义的一部分。

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

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

常见的约束类型是:

  • 不为空 - 列中的每个值都不得为 NULL
  • 唯一 - 指定列中的值对于表格中的每一行必须是唯一的
  • 主键 - 指定列中的值对于表中的每一行必须是唯一的,而不是 NULL ;通常,数据库中的每个表都应该有一个主键 - 它用于标识单个记录
  • 外键 - 指定列中的值必须引用另一个表中的现有记录(通过它的主键或其他一些唯一约束
  • 检查 - 指定了一个表达式,必须将其评估为true才能满足约束

答案 1 :(得分:36)

要理解我们需要约束的原因,您必须首先了解数据完整性的价值。

数据完整性是指数据的有效性。您的数据有效吗?您的数据是否代表您设计的内容?

我问你可能会想到什么奇怪的问题,但遗憾的是,数据库充满了垃圾数据,对其他表中的行的无效引用,很久以前......以及对任何事物都没有意义的值解决方案的业务逻辑不再适用。

所有这些垃圾并不是唯一容易降低性能的垃圾,但也是你应用程序逻辑下的定时炸弹,它最终会检索那些不能理解的数据。

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

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

一位聪明人曾经说过:“数据必须保护自己!”。这就是约束所做的。规则使数据库中的数据尽可能有效。

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

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

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

FOREIGN KEY Constraints - Microsoft

Foreign key constraint - w3schools

CHECK Constraints

祝你好运! ;)

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

  1. UNIQUE约束(其中PRIMARY KEY约束是变体)。检查给定字段的所有值在表中是否唯一。这是X - 轴约束(记录)

  2. CHECK约束(其中NOT NULL约束是变体)。检查表达式在同一记录的字段上是否存在某种条件。这是Y - 轴约束(字段)

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

答案 6 :(得分:2)

数据库是概念(或业务)模型的计算机化逻辑表示,由一组非正式业务规则组成。这些规则是用户理解的数据含义。由于计算机仅包含正式表示,因此无法在数据库中直接表示业务规则。它们必须映射到形式表示,即逻辑模型,它由一组完整性约束组成。这些约束 - 数据库模式 - 是业务规则数据库中的逻辑表示,因此是DBMS理解的数据含义。因此,如果DBMS没有意识到和/或没有强制执行代表业务规则的全部约束,那么它对数据意味着什么并不能完全理解,因此不能通过防止腐败来保证(a)其完整性, (b)它从中做出的推断的完整性(即查询结果) - 这是另一种说法,即DBMS充其量是不完整的。

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

Fabian Pascal的“旧类错误”

答案 7 :(得分:2)

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

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

  • 键约束:,如果新元组中键属性的值 已存在于关系

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

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

答案 8 :(得分:-1)

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