CONSTRAINT 子句是指 限制和索引相似,虽然限制也能被用于建立和另一个表的关联。 用 ALTER TABLE 和 CREATE TABLE 语句中的 CONSTRAINT 子句来建立或删除条件.CONSTRAINT 子句可分为两种类型:第一种是在单一字段上创建条件;第二种是在一个以上的字段上创建条件。
语法
单一字段条件:
CONSTRAINT名 {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES 外部表 [(外部字段1,外部字段2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
多重字段条件:
CONSTRAINT名
CONSTRAINT name
{PRIMARY KEY (primary1[, primary2 [, ...]])|
|
UNIQUE (unique1[, unique2 [, ...]])|
|
NOT NULL (notnull1[, notnull2 [, ...]])|
FOREIGN KEY [NO INDEX] (ref1 [, ref2 [, ...]])REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]}
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
子句可分为以下几个部分:
部分 说明
name 欲创建的条件的名称。
primary1, primary2 被指定为主键.的
字段名。
unique1, unique2 欲设计成为唯一键的一个或多个字段之名称。
notnull1, notnull2 被限制为非 Null 值的字段的名称。
ref1, ref2 涉及到另一个表中的字段的外部键字段名
foreigntable 包含由外部字段注明的字段的外部表名。
foreignfield1, foreignfield2 由 ref1、ref2 指定的 foreigntable 中的字段的名称。如果引用的字段是 foreigntable 的主键,则可省略此子句。
说明
紧接在字段的数据类型规格之后,在 ALTER TABLE 或 CREATE TABLE 语句的字段定义子句中,使用单一字段条件之语法。
只要在 ALTER TABLE 或 CREATE TABLE 语句的字段定义子句之外使用
保留字 CONSTRAINT,就可以使用多重字段条件之语法。
将字段设计为如下的条件类型之一:
可以使用 UNIQUE
保留字将字段设计为唯一键。这意味着在同一个表中没有两个记录的这个字段的值是相同的。可以强制任何字段或字段列表为唯一的。如果多重字段条件被设计成唯一键,在索引之中的所有字段的组合值必须也是唯一的,即使在这些字段之中有两个或两个以上的记录有相同的值。
可以用 PRIMARY KEY 保留字,将表中的字段或一组字段设计为主键。在主键之中所有的值必须是唯一的,且不可为 Null,一个表只能有一个主键。
注意
在一个已经设有主键的表中,不能再设置 PRIMARY KEY 条件,否则会发生错误。
您可以使用 FOREIGN KEY
保留字将一个字段设置为外部键。如果
外部表的主键是由一个以上的字段所组成,则必须使用多重字段条件定义,列出全部的引用字段、外部表名、以及以列出引用字段相同的顺序在外部表中列出引用字段的名称。若所引用的字段是外部表的主键,则无须指定所引用的字段。根据默认,数据库引擎在认为外部表的主键是所引用字段的情况下执行操作。
外部键条件限定具体的活动在一个相应的主键值被改变时来执行:
你可以指定外部表上执行的活动,此活动基于一个在定义了CONSTRAINT的表中主键上执行的相应的活动。例如,考虑以下对“客户”表的定义
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
考虑表的以下定义,定义外部键与Customers表的主键关系的顺序为:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY), CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
ON UPDATE CASCADE 和 ON DELETE CASCADE 子句都定义于外部键上。 ON UPDATE CASCADE 子句的含义是:如果用户的
标识符(CustId)在用户表中更新,此更新将通过
顺序表级联。各个含有相应
用户标识符值的顺序随着新值自动更新。 ON DELETE CASCADE 子句的含义是:如果一个用户被从用户表中删除,顺序表中所有包含同样用户标识符值的位序也会被删除。
考虑到表中下列不同的定义,用 SET NULL 活动代替
CASCADE活动的顺序为:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
ON UPDATE SET NULL 子句的含义是:如果用户的
标识符 (CustId) 在用户表中更新,
顺序表中相应的外部键值将会被自动设为 NULL。相似地,ON DELETE SET NULL 子句的含义是:如果一个用户被从用户表中删除,顺序表中所有相应的外部键将会被自动设为NULL。
为阻止外部键
索引的自动生成,可使用变址器 NO INDEX。这一形式的外部键定义仅用于经常要复制形成索引值的情况。在外部键索引中的数值经常被复制的场合,使用索引不如直接进行表搜索有效。对这种索引和表中插入和删除的行列的维护会降低性能,没有任何好处。