什么是数据库约束?[关闭]


92

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


12
这个问题有明确的答案。它不是“太宽泛”。它的大量赞誉和收藏夹显示了它对许多人来说是多么有用。我已经清理了措辞,并提名它重新开放。
La-comadreja

@BasilBourque这个问题非常不适合Programmers-将很快被否决并在那儿关闭,请参阅meta.programmers.stackexchange.com/questions/6483/…推荐阅读:Programmers.SE上发生了什么?一种堆栈溢出指南
蚊蚋

1
@gnat虽然该页面让我仍然对Programmers Stack Exchange的主题模糊不清,但我可以理解并同意最低限度的帖子作者必须首先阅读直接相关的Wikipedia文章,该文章提供了在Stack Exchange上要求提供相同的摘要或摘要概述。
罗勒·布尔克

2
标题很宽泛,子问题一次要问多个问题-TomTom,Pரதீப்,greg-449,bummi和Nit想要什么?请解释。无论如何,您有没有可以问约束的...?
Lealo

尽管我理解问题过于局促和基于观点的观点,但我不同意初读维基百科文章的要求。它不提供“相同的摘要或摘要概述”。接受的答案比上面的Wikipedia链接提供了更简洁,更及时的答案。
克里斯(Chris

Answers:


117

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

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

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

常见的约束条件有:

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

3
+1(包括PK),不为null,null
gbn

+1,您仍然可以扩展FOREIGN KEY场景并提供一些链接。
Unreason

2
检查约束不得评估为false。他们不必是真的。未知也可以。
马丁·史密斯

2
类型约束不是常见的一种吗?
2013年

1
尽管我们通常不称其为约束,但我认为数据类型是约束的一种形式。如果我将某些内容定义为Int或datetime,则将限制可以放入字段中的数据类型。正确选择数据类型是确保数据完整性的关键部分。
HLGEM 2015年

36

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

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

我想问的您可能会想到的奇怪问题,但可悲的是,很多时候,数据库中充斥着垃圾数据,对其他表中行的无效引用,这些数据早已消失……以及对业务逻辑没有任何意义的值解决方案了。

所有这些垃圾不仅会降低性能,而且在应用程序逻辑下也是一个定时炸弹,最终将检索未经设计可理解的数据。

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

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

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

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

  • 外键约束可能是最常用的约束,它确保仅在实际存在要引用的目标行的情况下才允许对其他表的引用。这也使得不可能通过删除创建无效链接的引用行来打破这种关系。
  • 检查约束可以确保特定列中仅允许特定值。您可以创建一个约束,仅在VARCHAR列中允许单词“ Yellow”或“ Blue”。所有其他值都会产生错误。了解使用检查约束的想法,检查sys.check_constraintsAdventureWorks示例数据库中的视图
  • SQL Server中的规则只是可重用的检查约束(允许您从一个地方维护语法,并使将约束部署到其他数据库更容易)

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

外键约束-Microsoft

外键约束-W3Schools

检查约束

祝好运!;)


不可思议的是,Microsoft现在似乎已弃用规则。
加里

6

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

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

3

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


3

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

有关SQL Server 2008约束MSDN文档可能是您最好的起点。


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

  2. CHECK约束(NOT NULL约束是其变体)。检查同一记录的字段上的表达式是否满足特定条件。这是- Y轴约束(字段)

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


可以使用CHECK约束来编写唯一约束和外键约束,那么为什么将其分类为不同的呢?即“- Y轴”(无论什么意思)。
2011年

2
@onedaywhen:如何FOREIGN KEY使用CHECK约束实现?
Quassnoi

1
@onedaywhen:尝试创建具有此约束的表。
Quassnoi

1
@onedaywhen:尝试这么难吗?提示:这行不通。
Quassnoi

3
@onedaywhen:您编写的查询不会创建检查约束。这仅仅是一个SELECT查询。您不能在中的CHECK约束中使用子查询(或引用当前记录外部值的任何其他构造)SQL Server
Quassnoi

2

数据库是概念(或业务)模型的计算机化逻辑表示,由一组非正式业务规则组成。这些规则是用户理解的数据含义。因为计算机仅包含形式表示,所以业务规则不能直接在数据库中表示。它们必须映射到一个正式的表示形式,即一个逻辑模型,该逻辑模型由一组完整性约束组成。这些约束(数据库模式)是业务规则在数据库中的逻辑表示形式,因此是DBMS理解的数据含义。因此,如果DBMS不了解和/或不执行代表业务规则的全套约束,则对数据的含义不完全了解,因此,

注意:DBMS的“已理解”含义(完整性约束)与用户所理解的含义(业务规则)并不相同,但是尽管失去了某些含义,我们仍具有从数据中机械化逻辑推理的能力。

费边·帕斯卡(Fabian Pascal)的“老错误”


2

SQL中主要有4种主要约束类型:

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

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

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

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


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.