SQL 约束

时间:2018-11-15 17:48:20  来源:igfitidea点击:

在本教程中,我们将了解自动保证数据完整性的SQL约束。

SQL 约束介绍

约束或SQL约束是指在执行插入、更新和删除操作时定义哪些数据值是有效的规则。
当存在约束时,SQL 引擎会拒绝所有违反规则的事务,因此,约束可以帮助您保证数据的完整性。

ANSI SQL提供四种类型的约束,包括主键(PRIMARY KEY)、惟一性(UNIQUE)、外键(FOREIGN KEY)和检查(CHECK)。

SQL的约束范围

SQL约束可以应用在表级或者列级上。

  • 表级约束:声明应用于一个或多个列的表级约束。表级约束是独立于列定义声明的。通常在CREATE TABLE语句的末尾声明表级约束。
  • 列级约束:在为表定义列时声明列级约束。列级约束特别应用于它所连接的列。

声明的SQL约束

下面是SQL约束的一般语法:

CONSTRAINT [name] type [(column1, column2…)] 
           [predicate] 
           [deferment] 
           [deferment_timing]

让我们详细地看一下语法:

  • name:是约束的名称。这是一个可选的部分。如果您省略了约束的名称,数据库系统将自动为您创建一个名称。在某些数据库系统中,您还可以在声明约束时省略CONSTRAINT关键字。
  • type:是有效的约束类型之一,如主键(PRIMARY KEY)、惟一性(UNIQUE)、外键(FOREIGN KEY)和检查(CHECK)。如果数据库系统提供其他特定类型,则可以在这里指定。
  • column n1, column n2 ...:将约束附加到一个或多个列上。
  • predicate:仅适用于检查(CHECK)约束。
  • deferment:DEFERRABLE或者NOT DEFERRABLE之一,表示约束是否可延迟。如果约束是可延迟的,则数据库系统在事务结束时检查规则。当声明不可延迟的约束时,数据库系统将检查事务中的每个SQL语句的规则。
  • deferment_timing:如果约束是可延迟的,则可以使用 INITIALLY IMMEDIATE或INITIALLY DEFERRED来指定检查规则的默认时间。
    如果deferment_timing 设置为INITIALLY IMMEDIATE,则在每个语句之后检查约束。这是deferment_timing的默认值
    如果deferment_timing 设置为INITIALLY DEFERRED,那么约束只在事务结束时才会被检查。

请注意,不同的数据库系统实现的约束各不相同,因此请阅读相关的数据库文档。