SQL Server 约束2025年3月17日 | 阅读 12 分钟 约束是应用于表或列的预定义规则和限制集,用于限制未经授权的值插入到表中。它们负责确保表中列的数据准确性、完整性和可靠性。约束还规定,当插入的数据满足约束规则时,数据将被插入到表中。否则,如果插入的数据违反了定义的约束,插入操作将被终止。 SQL Server 将约束分为两种类型:
SQL Server 中使用的约束以下是 SQL Server 中最常用的约束,我们将通过示例深入描述它们
NOT NULL 约束SQL Server 中的列默认存储 NULL 值。我们可以通过使用 NOT NULL 约束来限制给定列中插入 NULL 值。如果我们尝试在该列中插入 NULL 值,则它被视为无效值。这意味着在使用 INSERT 或 UPDATE 操作时,我们必须在表中提供有效的非空值,因为该列将始终包含数据。 我们可以在创建表时或在创建表后使用 ALTER 语句应用 NOT NULL 约束。 以下示例将在创建表时在列中应用 NOT NULL 约束 接下来,我们将向表中插入一些值,以了解此约束如何工作。 执行上述插入语句将返回以下输出。在这里,我们可以看到第一个 INSERT 查询正确执行,但第二个语句失败并给出错误,指出列 'Amount' 不允许空值。 ![]() 当我们创建表“Sales”时,我们可以看到 Vender_Name 列没有应用任何约束。因此,它将插入默认值 NULL。如果我们要限制此列中的 NULL 值,我们使用以下语句 SQL Server 还允许我们在不执行 SQL 语句的情况下在表中创建 NOT NULL 约束。我们可以通过使用管理工作室来完成此操作,首先右键单击所需的表并选择设计选项。在“允许空值”选项中检查所有存储空值的列。 ![]() 唯一约束UNIQUE 约束确保不能将重复值插入到不属于 PRIMARY KEY 且参与 UNIQUE 约束的列或列组合中。此约束始终将唯一且不重复的值插入到列中。它类似于主键,但它允许一个空值。它可以在创建表时或在创建表后使用 ALTER 语句应用。 以下示例将在创建表时在列中创建 UNIQUE 约束 接下来,我们将向表中插入一些值,以了解此约束如何工作。 执行上述插入语句将返回以下输出。在这里,我们可以看到第一个 INSERT 查询正确执行,但第二个语句失败并给出错误。此错误指出 ID 列不允许重复值,并且指定的 ID 值已输入到该列中。 ![]() 如果我们想在现有表中添加唯一约束以防止输入重复项,我们可以使用以下语句 如果我们在错误的列中意外添加了约束,我们也可以在 SQL Server 中删除它。以下语句用于从特定列中删除约束 SQL Server 还允许我们在不执行 SQL 语句的情况下在表中创建 UNIQUE 约束。使用管理工作室,我们可以通过首先右键单击所需的表并选择设计选项来完成此操作。在设计窗口中,选择要添加约束的列,右键单击并选择索引/键选项。将出现一个新向导;单击添加。接下来,单击“常规”属性中的类型并从下拉列表中选择“唯一键”,然后单击“关闭”。最后,在文件菜单上保存表。 ![]() CHECK 约束此约束用于限制列中的值范围。它确保列中所有插入的值都必须遵循特定规则。换句话说,它根据给定条件确定与列关联的值是否有效。它控制特定列中的值,并确保不会将损坏的信息输入到列中。我们可以为特定列指定多个检查约束。当条件中包含 NULL 值时,此约束将产生 UNKNOWN 值。 我们可以在创建表时或在创建表后使用 ALTER 语句应用 CHECK 约束。 以下示例将在创建表时在 salary 列中应用 CHECK 约束。此约束指示 salary 列不能存储小于或等于 10000 的值。 接下来,执行以下插入语句以向表中添加记录 执行此操作将返回以下结果 ![]() 从结果中可以清楚地看出,第一个插入语句在没有任何错误的情况下添加了记录,因为 salary 列中提供的值满足检查条件。第二个插入语句将失败,因为 salary 列中提供的值由于插入小于 10000 的值而不满足检查条件。 我们知道,如果参与的列允许 NULL,此约束也可以插入 NULL 值。这些 NULL 值将被评估为 UNKNOWN 而不会产生错误。尽管以下语句中的 salary 列值为 NULL,但它成功执行并将记录添加到表中 验证表将返回以下输出,其中 salary 列在 ID 3 行中显示 NULL 值。 ![]() 我们在创建表时没有提及约束名称,然后 SQL Server 将自动为该约束分配一个唯一的名称。要检查约束名称,请使用 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 系统对象,该对象检索给定表中所有已定义约束的信息。以下是语句 它返回以下输出,其中显示了给定表的所有约束名称。 ![]() 如果我们想删除 CHECK 约束,请执行以下命令 如果我们想在现有表中添加 CHECK 约束,请执行以下命令 我们还可以使用管理工作室工具创建 CHECK 约束。为此,首先右键单击所需的表并选择设计选项。在设计窗口中,选择要添加约束的列,右键单击并选择“检查约束”选项。将出现一个新向导,指定约束名称、表达式以及是否需要检查现有数据,然后单击“关闭”。最后,在文件菜单上保存表。 ![]() DEFAULT 约束此约束用于在用户未为该列指定任何值时在列中插入默认值。当未向指定的默认约束列提供任何值时,它有助于维护域完整性。它还确保该列必须包含一个值,包括常量值、系统定义值或 NULL。它也可以在创建表时或创建表后创建。 让我们通过一个示例来理解它。以下语句将创建一个包含四列的表。在这里,我们已在 Salary_Date 列上定义了一个 DEFAULT 约束,如果我们在 INSERT 语句中未指定该列,则它会为该列分配系统日期值 执行以下语句以向表中插入记录 上述语句成功执行。我们可以使用 SELECT 语句验证插入的记录。在这里,我们看到第二行的 Salary_Date 列值被分配了当前日期和时间值,因为我们没有在 INSERT 语句中提及它 ![]() 以下语句将在创建表后添加 DEFAULT 约束。在从 Salary_date 列删除约束后,应为上述表执行此语句。 要从列中删除默认约束,我们需要首先通过展开当前表下的约束节点来获取约束名称。 ![]() 然后,我们可以使用以下语句从列中删除约束 我们还可以使用管理工作室工具创建 DEFAULT 约束。转到设计选项,选择要添加约束的列,然后通过浏览列属性窗口分配默认值,如下所示。最后,单击“关闭”,然后在文件菜单上保存表。 ![]() PRIMARY KEY 约束此约束由一个或多个具有值的列组成,并唯一标识表中的每条记录。我们不能在主键约束列中输入空值、空值或重复值。每个表只能包含一个主键列;但是,它可以有重复的列。它始终在列中包含唯一值。我们主要使用此约束来强制表的实体完整性。 如果我们将主键约束定义为多个列的组合,则可以在每个列中单独插入重复值;但是,所有 PRIMARY KEY 列的组合值必须是唯一的。此约束与 UNIQUE 约束不同,因为表可以创建多个唯一约束,但每个表只能有一个主键。 以下语句创建一个名为“person”的表,其中包含三列:ID、Name 和 Country。在这里,我们将 ID 列定义为表的主键,以通过确保此列不能包含 NULL、空或重复值来标识表的每条记录。以下是语句 接下来,我们将执行以下三个插入语句 执行这些语句将返回以下消息。它显示第一个插入查询成功执行并将两条记录添加到表中,因为所有提供的列值都有效。第二个插入语句失败,因为 ID 列被定义为主键,因此此列是强制性的且不能为 NULL。第三个插入操作失败,因为给定的 ID 值已存在,并且不能在 PRIMARY KEY 列中输入重复值。 ![]() 由于我们在表定义期间未指定 PRIMARY KEY 约束的名称,因此 SQL Server 将自动为其分配一个唯一的名称。我们可以使用 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 系统对象查看主键约束名称。以下是输出 ![]() 如果我们要为主键约束提供另一个名称,我们首先使用以下语句删除默认名称 现在,我们使用以下语句在创建表后或删除默认名称后添加主键约束以指定新名称。 注意:我们确保使用 ALTER TABLE 命令将主键约束添加到列时,必须已声明 NOT NULL 约束(首次创建表时)并且只有 UNIQUE 值。否则,查询将失败。我们还可以使用管理工作室创建 PRIMARY KEY 约束。右键单击所需的表,选择设计选项并选择要添加约束的列。再次,右键单击您的列并设置 PRIMARY KEY 选项,这将自动取消选中“允许空值”复选框:最后,单击“关闭”,然后在文件菜单上保存表。 ![]() FOREIGN KEY 约束外键是将两个表链接在一起的数据库键。此约束也称为引用键,因为它通过引用包含外键的子表的列到父表的主键列来标识表之间的关系。这意味着一个表中的外键列引用另一个表的主键列。 FOREIGN KEY 约束与 PRIMARY KEY 约束不同,因为每个表只能有一个 PRIMARY KEY。相反,每个表可以通过引用多个父表来拥有多个 FOREIGN KEY 约束。此外,我们不能在主键列中插入 NULL 值,但如果未为此键定义 NOT NULL 约束,我们可以在外键列中拥有 NULL 值。 SQL Server 允许在表创建期间或表创建后添加 FOREIGN KEY 约束。让我们通过首先创建两个新表来了解其功能,其中第一个表充当父表,第二个表充当子表。父表中的 PID 列定义为主键,子表中的 CID 列定义为引用父表 ID 列的外键列。 以下是创建两个表的代码脚本 接下来,我们将执行以下插入语句。第一个插入语句向父表添加三行,另两个插入语句向子表添加两条记录 执行这些语句将显示以下结果 ![]() 上述输出图像显示,第一个插入查询向父表添加了三行。第二个插入语句将向子表添加一条记录,没有任何错误,因为 ID 值 1 已存在于父表中。第三个插入语句将失败,并且不会向子表添加任何记录,因为 ID 值 4 不存在于父表中。由于 FOREIGN KEY 限制,我们将无法将不存在于父表中的 ID 值插入到子表中。 我们可以使用 SELECT 语句验证父表和子表中插入的记录。 ![]() 假设我们想在 SQL Server 自动创建子表后定义 FOREIGN KEY 约束名称。为此,我们首先需要从 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 语句中检索约束名称,删除此名称,然后使用 ALTER 语句分配一个唯一的名称。以下是代码脚本 我们还可以使用 SQL Server Management Studio 工具定义外键约束。右键单击所需的表,选择设计选项,然后从菜单中选择“关系”选项 ![]() 关系选项显示另一个窗口,我们将在其中指定外键约束名称以及将参与该关系的表和列,方法是单击“表和列规范”。现在,当父表上的引用记录被删除或修改时,单击“确定”按钮完成操作。 ![]() 下一个主题SQL Server 分析器 |
我们请求您订阅我们的新闻通讯以获取最新更新。