约束可以在创建表的同时指定,也可以在表创建之后再指定。如果与表同时创建,那么在创建表的CREATE语句中通过CONSTRAINT关键字指定约束的名称和约束类型。在CREATE TABLE语句中可以定义列级和表级两种约束。
(1)列级约束
列级约束是针对某一个特定列,它的定义在列的定义之后。CREATE TABLE语句中定义列级约束的语法为:
CREATE TABLE表名(
列名1数据类型CONSTRAINT约束名1约束类型,
列名2数据类型CONSTRAINT约束名2约束类型,
…
);
其中约束名是为约束指定的唯一的名称。约束名可以由用户自己指定,也可以自动产生。如果省略关键字CONSTRAINT和约束名称,那么约束名称将自动产生。如果约束名称是自动产生的,那么根据这样的名称无法判断约束所在的表以及约束类型。如果用户自己指定约束名称,则可以在名称中包含表名、约束类型等有用信息。
例如,下面的CREATE语句用来创建一个表orders1,并在部分列上指定约束。
在创建表orders1时指定了3个约束,第一个约束指定orderid列为主键,第二个约束指定订单编号ordernum列不为空,第三个约束指定付款方式payterms列的值只能是“在线付款”或“货到付款”,这些约束都是列级约束,并且都指定了名字。也可以简化,不指定名称,系统将自动为它们指定各自的名字,如下面的CREATE语句。
外键约束的定义形式比较复杂,因为外键要与另一个表的主键进行关联,所以不仅要指定约束的类型和有关的列,还要指定与哪个表的哪个列进行关联。
如果在列级定义外键约束,定义的格式为:
CONSTRAINT约束名FOREIGN KEY REFERENCES表名(列名);
其中,约束名是为这个外键约束起的名字。FOREIGN KEY为约束类型,即外键约束。REFERENCES关键字指定与哪个表的哪个列进行关联。定义外键约束时,如果是列级约束,则可以省略FOREIGN KEY,定义格式则简化为:
CONSTRAINT约束名REFERENCES表名(列名);
例如,在上面创建表orders2的语句中,在外键列为bookid上定义了名为fk_bookid的外键约束,它与表books的bookid列进行关联。这个外键的定义语句即为最后一行:
CONSTRAINT fk_bookid REFERENCES books(bookid)(www.daowen.com)
(2)表级约束
表级约束的定义在所有列的定义之后,用逗号(,)与列的定义分隔,独立于列的定义。定义表级约束的CREATE语句格式为:
CREATE TABLE表名(
列1数据类型,
列2数据类型,
…
CONSTRAINT约束名1约束类型(列名),
CONSTRAINT约束名2约束类型(列名),
…
);
在5种约束中,NOT NULL约束只能以列级约束的形式定义,其余4种既可以列级约束的形式定义,也可以表级约束的形式定义。因为表级约束是在所有列之后定义的,而不是在某个具体的列之后定义,所以在表级约束中要指定相关的列名。
例如,上面的创建表的CREATE语句也可以改为下面的形式:
如果外键约束定义在表级,那么外键的定义代码放置在所有列的定义之后,它的格式为:
CONSTRAINT约束名FOREIGN KEY(外键列)REFERENCES表名(列名)
例如,在表orders中的bookid列上施加的外键约束也可以通过下面的形式定义:
CONSTRAINT fk_bookid FOREIGN KEY(bookid)REFERENCES books(bookid)
如果一个约束涉及多个列的组合,那么就不能在每个列之后指定约束,而只能定义为表级约束。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。