CONSTRAINT 子句

约束与索引类似,但还可用于与另一个表建立关系。

可使用 ALTER TABLE 和 CREATE TABLE 语句中的 CONSTRAINT 子句来创建或删除约束。有两种类型的 CONSTRAINT 子句:一种用于对单个字段创建约束,另一种用于对多个字段创建约束。

注意: Microsoft Access 数据库引擎不支持将 CONSTRAINT 或任何数据定义语言语句与非 Microsoft Access 数据库引擎数据库结合使用。请改为使用 DAO Create 方法。

语法

单字段约束:

CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable [(foreignfield1, foreignfield2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

多字段约束:

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]}

CONSTRAINT 子句包含以下部分:

部分

说明

name

要创建的约束的名称。

primary1, primary2

要指定为主键的字段的名称。

unique1, unique2

要指定为唯一键的字段的名称。

notnull1, notnull2

限制为非 Null 值的字段的名称。

ref1, ref2

参考另一表中的字段的外键字段的名称。

foreigntable

包含 foreignfield 所指定字段的外表的名称。

foreignfield1, foreignfield2

foreigntable 中由 ref1ref2 指定的字段的名称。如果引用的字段是 foreigntable 的主键,则可省略此子句。


备注

在 ALTER TABLE 或 CREATE TABLE 语句中,应紧随字段的数据类型规范后使用单字段约束的语法。

在 ALTER TABLE 或 CREATE TABLE 语句中,只要在字段定义子句外使用保留字 CONSTRAINT,就应使用多字段约束的语法。

使用 CONSTRAINT 可将一个字段指定为以下类型的约束之一:

  • 可使用 UNIQUE 保留字将字段指定为唯一键。这意味着表中任意两个记录在此字段中的值都不相同。可将任何字段或字段列表约束为唯一键。如果将多字段约束指定为唯一键,则索引中所有字段的组合值必须是唯一的,即使两个或更多记录只有一个相同的字段值。

  • 可使用 PRIMARY KEY 保留字将表中的一个或一组字段指定为主键。主键中的所有值都必须是唯一的,并且不为 Null,一个表只能有一个主键。

    注意: 请勿对已有主键的表设置 PRIMARY KEY 约束;这样做会出现错误。

  • 可使用 FOREIGN KEY 保留字将一个字段指定为外键。如果外表的主键由多个字段组成,则必须使用多字段约束定义,同时列出所有引用字段,以及外表中被引用的字段的名称(按照列出引用字段的相同顺序)。如果被引用的字段是外表的主键,则不必指定该字段。默认情况下,数据库引擎按照外表主键是被引用的字段的情形行事。

    外键约束定义在相应主键值更改时执行的特定操作:

  • 可根据在定义了 CONSTRAINT 的表中主键执行的相应操作,指定对外表执行的操作。例如,请注意 Customers 表的以下定义:

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

请注意 Orders 表的以下定义,其中定义的外键关系引用了 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 子句表示如果 Customers 表中的客户标识符 (CustId) 更新,则更新将级联到 Orders 表中。包含相应客户标识符值的每个订单都将使用新值自动更新。ON DELETE CASCADE 子句表示如果从 Customers 表中删除了客户,则 Orders 表中包含相同客户标识符值的所有行也将被删除。

请注意 Orders 表的以下不同定义,其中的 CASCADE 操作替换为 SET NULL 操作:

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 子句表示如果从 Customers 表中删除了客户,则 Orders 表中所有对应的外键都将自动设置为 NULL。

为防止自动创建外键索引,可使用修饰符 NO INDEX。仅应在要频繁复制生成的索引值时使用此形式的外键定义。如果要经常复制外键索引中的值,使用索引的效率可能比仅执行表扫描效率更低。如果保持使用此类索引,则在表中插入和删除行时,性能会降低并且没有任何好处。



扩展你的技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×