在定义表时还需要进一步定义,如主键、空值的设定,使数据库用户能够根据应用的需要对基本表的定义做出更为精确和详尽的规定。
1.使用T⁃SQL语句设置约束
表的约束可以有下面两种方式。
列约束:在列的定义中给出对该列数据的约束条件。表中任意一行在该列上的值若在改变时破坏了规定的条件,将拒绝这种操作。
表约束:即在所有列定义后面给出的约束。若表中任一行在该列(或列集合)上的值在改变时破坏了规定的条件,这种操作将被拒绝。
可以在创建表的时候设置约束,也可以在修改表的时候设置约束。
下面给出创建表时设置约束的语法。
(1)列约束
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔。在前面创建表的定义中已经包含空值或非空值约束和默认值约束,下面介绍主码约束、唯一约束、外码约束和检查约束,在表的定义中它们遵守<column_constraint>部分的语法规则,格式如下。
其中,[CONSTRAINT constraint_name]可以默认不写,CONSTRAINT表示约束定义的开始,constraint_name是默认约束名。
为了便于理解,下面分别列出每种约束的单个定义。每种约束的书写位置应参考表定义和列约束定义的语法。
1)空值或非空值约束,用于设置某列上的值是否允许为空,语法如下。
其中,NULL表示该列上的值允许为空,即允许接受空值;NOT NULL表示该列上的值不允许为空。NULL不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不确定”或“没有数据”的意思。例如,主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用。对于非主属性,不注明此约束则隐含为空值约束。
2)默认值约束,用于设置当不给某列输入值时采用默认值,语法如下。
其中,DEFAULT是默认约束关键词,constant_expressio是该列默认值。
3)主码(键)约束,用于设置基本表的主码(键),起唯一标识作用,其值不能为NULL,也不能重复。一个关系只能有一个主码,语法如下。
其中,PRIMARY KEY是主码(键)约束关键词。
4)唯一约束,用于指明基本表在某列上的取值必须唯一,系统为保证其唯一性,最多该列只可以出现一个NULL值。在表约束中可以为一组列设置唯一约束。列唯一约束的语法如下。
其中,UNIQUE是唯一约束关键词。
PRIMARY KEY与UNIQUE的区别:在一个基本表中只能定义一个PRIMARY KEY约束,但可定义多个UNIQUE约束;对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许出现一个空值。注意,不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARY KEY约束。
5)外码(键)约束,用于指定某一个列作为外码。其中,包含外码的表称为从表,包含外码所引用的主码(或唯一键)的表称为主表。系统保证从表在外码上的取值要么为空值,要么是主表中某一个主码值(或唯一键值),以此保证主表和从表之间一对多的联系。在表约束中可以为一组列设置外码约束。列外码(键)约束的语法如下。
上述数据参数中
●[FOREIGN KEY]REFERENCES:为列中的数据提供外码约束。
●ref_table_name:FOREIGN KEY约束引用的表(即主表,也叫父表)的名称。
●ref_column:FOREIGN KEY约束所引用的表中的一列名(即主表的主码或唯一键)。
●ON DELETE{NO ACTION|CASCADE|SET NULL|SET DEFAULT}:指定如果子表中的行具有引用关系,并且被引用行已从父表中删除,则对子表中这些行将发生什么操作。默认值为NO ACTION。
●NO ACTION:数据库引擎将引发错误,并回滚对(撤销)父表中相应行的删除操作。
●CASCADE:如果从父表中删除了一行,则将从引用表中删除相应行。
●SET NULL:如果从父表中删除了一行,则子表中组成外键的相应值都将设置为NULL。若要执行此约束,外键列必须为空值。
●SET DEFAULT:如果从父表中删除了一行,则子表中组成外键的相应值都将设置为默认值。若要执行此约束,所有外键列必须有默认定义。如果某个列可为空值,并且未设置默认值,组成外键的相应值都将设置为NULL。
●ON UPDATE{NO ACTION|CASCADE|SET NULL|SET DEFAULT}:指定如果子表中发生更改的行有引用关系,并且被引用行在父表中已更新,则这些行将发生什么操作。默认值为NO ACTION。
●NO ACTION:数据库引擎将引发错误,并回滚(撤销)对父表中相应行的更新操作。
●CASCADE:如果在父表中更新了一行,则将在子表中更新相应行。
●SETNULL:如果在父表中更新了一行,则子表中组成外键的相应值都将设置为NULL。若要执行此约束,外键列必须为空值。
●SET DEFAULT:如果在父表中更新了一行,则子表中组成外键的相应值都将设置为默认值。若要执行此约束,所有外键列必须有默认定义。如果某个列可为空值,并且未设置默认值,组成外键的相应值都将设置为NULL。
●NOT FOR REPLICATION:当执行更新或删除操作时,将不会强制执行此约束。
6)检查约束,用于设置列值所允许的范围,语法如下。
说明:CHECK是检查约束关键词,logical_expression是该列值所允许的范围,NOT FOR REPLICATION是当执行插入、更新或删除操作时将不会强制执行此约束。
【例3-23】 根据如表3-7所示的表结构,使用T⁃SQL语句创建“课程”表。
表3-7 “课程”表的表结构
在“查询”窗格中输入如下代码。
执行代码并在“对象资源管理器”中刷新“teaching”数据库结点下的表结点,将看到所创建的“Kc”表。
注意:主表和从表中相关字段的数据类型定义必须一致。
(2)表约束
表约束是对某一个特定列或列集(多个列的集合)的约束,在表的定义中它位于所有列定义之后,与前面的列定义用逗号分隔。在所有的约束中,主码约束、唯一约束、外码约束和检查约束可以定义为表约束,在表的定义中,它们遵守<table_constraint>部分的语法规则,格式如下。
上述数据参数中
●在列约束中已出现过的标识符请参考列约束语法说明。
●CLUSTERED|NONCLUSTERED:指示为PRIMARY KEY或UNIQUE约束创建聚集索引或非聚集索引。PRIMARY KEY约束默认为CLUSTERED,UNIQUE约束默认为NONCLUSTERED。
●Column:指定主键列的名称。
●ASC|DESC:指定索引列的排序方式,ASC是升序,DESC是降序。默认按升序排序。
【例3-24】 根据如表3-8所示的表结构,使用T⁃SQL语句创建“成绩”表。
表3-8 “成绩”表的表结构(www.xing528.com)
在“查询”窗格中输入如下代码。
执行代码并在“对象资源管理器”中刷新“teaching”数据库结点下的表结点,将看到所创建的“Cj”表。
2.使用对象资源管理器设置约束
【例3-25】 新建一个“teaching2”数据库,在该数据库下快速建立“教师表”和“课程表”(此处“课程表”只加非空约束),使用对象资源管理器为“课程表”设置表3-7中所要求的各种约束。
使用对象资源管理器新建“teaching2”数据库,设置“teaching2”为当前数据库。然后分别创建“教师表”和“课程表”,表设计窗格分别如图3-21和图3-22所示。
图3-21 创建“Js”表的表设计窗格
图3-22 创建“Kc”表的表设计窗格
(1)空值或非空值约束
该约束已经在建表的时候设置:设置Kch和Kcm为非空值约束。
(2)主码(键)约束
如果已经关闭“课程”表的表设计窗格,则在“对象资源管理器”中右击“课程”表,在弹出的快捷菜单中选择“修改”命令,打开如图3-22所示的表设计窗格。
在“Kc”表的表设计窗格中右击“Kch”字段,如图3-23所示,在弹出的快捷菜单中选择“设置主键”命令。也可以单击工具栏中的“设置主键”按钮,完成设置后在该列名左侧出现一个钥匙图标。如果需要将多列设置为主键则选中多个字段,再设置主键。
(3)唯一约束
在“Kc”表的表设计窗格中右击“Kcm”字段,并在弹出的快捷菜单中选择“索引/键”命令,如图3-24所示。
也可以单击工具栏中的“管理索引和键”按钮,打开“索引/键”对话框。
图3-23 “索引/键”对话框
图3-24 设置唯一约束的相关选项
此时将打开如图3-25所示的“索引/键”对话框。在“索引/键”对话框中,单击“添加”按钮,则左侧列表框中出现唯一键名“IX_Kc”(其右侧有一个“*”号,表示是正在编辑的键),在右侧的“常规”选项中的“类型”下拉列表中选择“唯一键”,在“是唯一的”下拉列表中选择“是”,当然也可以在“标识”文本框中修改“名称”值(键名),结果如图3-26所示。设置好相关选项后,单击“关闭”按钮,完成唯一约束的创建。
图3-25 “索引/键”对话框
图3-26 选择“索引/键”命令
(4)默认值约束
在“Kc”表的表设计窗格中单击“Kcxz”字段,在下方的“列属性”选项卡的“默认值或绑定”文本框中输入默认值“考试”,如图3-27所示。
图3-27 输入默认值
注意:单引号不用输入,输入“考试”然后按〈Enter〉键后会自动生成。
(5)外码(键)约束
如图3-28所示,在“Kc”表的表设计窗格中鼠标右键单击“Jsh”字段,并在弹出的快捷菜单中选择“关系”命令,将打开“外键关系”对话框。
图3-28 选择“关系”命令
也可以单击工具栏中的“关系”按钮,打开“外键关系”对话框。
在“外键关系”对话框中,单击“添加”按钮,则左侧列表框中出现外键名“FK_Kc_Kc”,如图3-29所示。
在“外键关系”对话框中,单击右侧“表和列规范”选项,则在该行出现按钮,点击按钮打开“表和列”对话框。
在“主键表”下拉列表中选择“Js”表,“外键表”选项使用默认值“Kc”表,分别在“主键表”和“外键表”的下面选择“Jsh”字段,结果如图3-30所示。
单击“确定”按钮,关闭“表和列”对话框。在“外键关系”对话框中点击“关闭”按钮完成外键约束的创建。
图3-29 “外键关系”对话框
图3-30 “表和列”对话框
(6)检查约束
在“Kc”表的表设计窗格中右击“Lb”字段,如图3-31所示,在弹出的快捷菜单中选择“CHECK约束”命令,将打开“CHECK约束”对话框。
也可以单击工具栏中的“管理CHECK约束”按钮,打开“CHECK约束”对话框。
在“CHECK约束”对话框中,单击“添加”按钮,则左侧列表框中出现检查约束名“CK_Kc”,然后单击右侧“表达式”选项,则在该行出现按钮,如图3-32所示。
图3-31 选择“CHECK约束”命令
图3-32 “CHECK约束”对话框
点击按钮打开“CHECK约束表达式”对话框,输入“([Lb]=′基础课′or[Lb]=′专业课′or[Lb]=′选修课′)”,如图3-33所示。
图3-33 “CHECK约束表达式”对话框
单击“确定”按钮,关闭“CHECK约束表达式”对话框。在“CHECK约束”对话框中点击“关闭”按钮完成检查约束的创建。
注意:
如果表中原来有数据,并且数据类型或范围与所创建的约束冲突,则不能成功创建该约束。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。