CONSTRAINT 子句 (Microsoft Jet SQL)

此頁(yè)沒(méi)有內(nèi)容條目
內(nèi)容

CONSTRAINT 子句

限制索引相似,雖然限制也能被用于建立和另一個(gè)表的關(guān)聯(lián)。

ALTER TABLECREATE TABLE 語(yǔ)句中的 CONSTRAINT 子句來(lái)建立或刪除條件.CONSTRAINT 子句可分為兩種類型:第一種是在單一字段上創(chuàng)建條件;第二種是在一個(gè)以上的字段上創(chuàng)建條件。


注意 Microsoft Jet 數(shù)據(jù)庫(kù)引擎并不支持使用 CONSTRAINT ,或任何非 Microsoft JET 數(shù)據(jù)庫(kù)的數(shù)據(jù)定義語(yǔ)言 (DDL) 語(yǔ)句。而使用 DAO創(chuàng)建方法。


語(yǔ)法

單一字段條件:

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

子句可分為以下幾個(gè)部分:

部分

說(shuō)明

name

欲創(chuàng)建的條件的名稱。

primary1, primary2

被指定為主鍵.的字段名。

unique1, unique2

欲設(shè)計(jì)成為唯一鍵的一個(gè)或多個(gè)字段之名稱。

notnull1, notnull2

被限制為非 Null 值的字段的名稱。

ref1, ref2

涉及到另一個(gè)表中的字段的外部鍵字段名

foreigntable

包含由外部字段注明的字段的外部表名。

foreignfield1, foreignfield2

ref1、ref2 指定的 foreigntable 中的字段的名稱。如果引用的字段是 foreigntable 的主鍵,則可省略此子句。

 

說(shuō)明

緊接在字段的數(shù)據(jù)類型規(guī)格之后,在 ALTER TABLE 或 CREATE TABLE 語(yǔ)句的字段定義子句中,使用單一字段條件之語(yǔ)法。

只要在 ALTER TABLE 或 CREATE TABLE 語(yǔ)句的字段定義子句之外使用保留字 CONSTRAINT,就可以使用多重字段條件之語(yǔ)法。

使用 CONSTRAINT,可以將字段設(shè)計(jì)為如下的條件類型之一:

?可以使用 UNIQUE 保留字將字段設(shè)計(jì)為唯一鍵。這意味著在同一個(gè)表中沒(méi)有兩個(gè)記錄的這個(gè)字段的值是相同的??梢詮?qiáng)制任何字段或字段列表為唯一的。如果多重字段條件被設(shè)計(jì)成唯一鍵,在索引之中的所有字段的組合值必須也是唯一的,即使在這些字段之中有兩個(gè)或兩個(gè)以上的記錄有相同的值。
?可以用 PRIMARY KEY 保留字,將表中的字段或一組字段設(shè)計(jì)為主鍵。在主鍵之中所有的值必須是唯一的,且不可為 Null,一個(gè)表只能有一個(gè)主鍵。

注意 在一個(gè)已經(jīng)設(shè)有主鍵的表中,不能再設(shè)置 PRIMARY KEY 條件,否則會(huì)發(fā)生錯(cuò)誤。


?您可以使用 FOREIGN KEY 保留字將一個(gè)字段設(shè)置為外部鍵。如果外部表的主鍵是由一個(gè)以上的字段所組成,則必須使用多重字段條件定義,列出全部的引用字段、外部表名、以及以列出引用字段相同的順序在外部表中列出引用字段的名稱。若所引用的字段是外部表的主鍵,則無(wú)須指定所引用的字段。根據(jù)默認(rèn),數(shù)據(jù)庫(kù)引擎在認(rèn)為外部表的主鍵是所引用字段的情況下執(zhí)行操作。

外部鍵條件限定具體的活動(dòng)在一個(gè)相應(yīng)的主鍵值被改變時(shí)來(lái)執(zhí)行:

?你可以指定外部表上執(zhí)行的活動(dòng),此活動(dòng)基于一個(gè)在定義了CONSTRAINT的表中主鍵上執(zhí)行的相應(yīng)的活動(dòng)。例如,考慮以下對(duì)“客戶”表的定義

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

考慮表的以下定義,定義外部鍵與Customers表的主鍵關(guān)系的順序?yàn)椋?/span>

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 子句的含義是:如果用戶的標(biāo)識(shí)符(CustId)在用戶表中更新,此更新將通過(guò)順序表級(jí)聯(lián)。各個(gè)含有相應(yīng)用戶標(biāo)識(shí)符值的順序隨著新值自動(dòng)更新。 ON DELETE CASCADE 子句的含義是:如果一個(gè)用戶被從用戶表中刪除,順序表中所有包含同樣用戶標(biāo)識(shí)符值的位序也會(huì)被刪除。

考慮到表中下列不同的定義,用 SET NULL 活動(dòng)代替CASCADE活動(dòng)的順序?yàn)椋?/span>

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 子句的含義是:如果用戶的標(biāo)識(shí)符 (CustId) 在用戶表中更新,順序表中相應(yīng)的外部鍵值將會(huì)被自動(dòng)設(shè)為 NULL。相似地,ON DELETE SET NULL 子句的含義是:如果一個(gè)用戶被從用戶表中刪除,順序表中所有相應(yīng)的外部鍵將會(huì)被自動(dòng)設(shè)為NULL。

為阻止外部鍵索引的自動(dòng)生成,可使用變址器 NO INDEX。這一形式的外部鍵定義僅用于經(jīng)常要復(fù)制形成索引值的情況。在外部鍵索引中的數(shù)值經(jīng)常被復(fù)制的場(chǎng)合,使用索引不如直接進(jìn)行表搜索有效。對(duì)這種索引和表中插入和刪除的行列的維護(hù)會(huì)降低性能,沒(méi)有任何好處。

請(qǐng)參閱

ADD USER 語(yǔ)句

CREATE USER 或 GROUP 語(yǔ)句

ALTER USER 或 DATABASE 語(yǔ)句

CREATE VIEW 語(yǔ)句

ALTER TABLE 語(yǔ)句

DROP 語(yǔ)句

CREATE INDEX 語(yǔ)句

DROP USER 或 GROUP 語(yǔ)句

CREATE PROCEDURE 語(yǔ)句

GRANT 語(yǔ)句

CREATE TABLE 語(yǔ)句

REVOKE 語(yǔ)句

 

示例

CREATE TABLE 語(yǔ)句,CONSTRAINT 子句示例