数据库原理与应用(SQL-Server-)-第10章-数据完整性课件_第1页
数据库原理与应用(SQL-Server-)-第10章-数据完整性课件_第2页
数据库原理与应用(SQL-Server-)-第10章-数据完整性课件_第3页
数据库原理与应用(SQL-Server-)-第10章-数据完整性课件_第4页
数据库原理与应用(SQL-Server-)-第10章-数据完整性课件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章数据完整性数据库原理与应用(SQLServer)110.1

数据完整性概述10.2

约束10.3

应用举例10.1

数据完整性概述数据库原理与应用(SQLServer)2

1.实体完整性实体完整性要求表中有一个主键,其值不能为空且能唯一地标识对应的记录,又称为行完整性,通过PRIMARYKEY约束、UNIQUE约束等实现数据的实体完整性。例如,对于StoreSales数据库中SalesOrder表(订单表),OrderID(订单号)列作为主键,每一个订单的OrderID列能唯一地标识该订单列建立主键约束实现SalesOrder表的实体完整性。10.1

数据完整性概述数据库原理与应用(SQLServer)32.参照完整性

参照完整性保证主表中的数据与从表中数据的一致性,又称为引用完整性,在SQLServer中,通过定义主键(主码)与外键(外码)之间的对应关系实现参照完整性,参照完整性确保键值在所有表中一致。

主键:表中能唯一标识每个数据行的一个或多个列。

外键:一个表中的一个或多个列的组合是另一个表的主键。例如,将SalesOrder表作为主表,表中的OrderID列作为主键,OrderDetail表(订单明细表)作为从表,表中的OrderID列作为外键,从而建立主表与从表之间的联系实现参照完整性。

如果定义了两个表之间的参照完整性,则要求:

从表不能引用不存在的键值。

如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。

如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录。10.1

数据完整性概述3.域完整性域完整性指列数据输入的有效性,又称列完整性,通过CHECK约束、DEFALUT约束、NOTNULL约束等实现域完整性。CHECK约束通过显示输入到列中的值来实现域完整性,例如:对于StoreSales数据库OrderDetail表(订单明细表),Quantity(订货数量)规定为大于或等于2,可用CHECK约束表示。4.用户定义完整性可以定义不属于其它任何完整性类别的特定业务规则,所有完整性类别都支持用户定义完整性,包括CREATETABLE中所有列级约束和表级约束、规则、默认值、存储过程以及触发器。数据库原理与应用(SQLServer)410.2约束数据库原理与应用(SQLServer)5实体完整性、参照完整性、域完整性通过约束来实现,其中:

PRIMARYKEY约束,主键约束,实现实体完整性。

UNIQUE约束,唯一性约束,实现实体完整性。

FOREIGNKEY约束,外键约束,实现参照完整性。

CHECK约束,检查约束,实现域完整性。

DEFALUT约束,默认约束,实现域完整性。

NOTNULL约束,非空约束,实现域完整性。10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)6表的一列或几列组合的值在表中唯一地确定一行记录,这样的一列或多列称为表的主键(PRIMARYKEY,PK),通过它可强制表的实体完整性。表中可以有不止一个键唯一标识行,每个键都称为候选键,只可以选其中一个候选键作为表的主键,其他候选键称作备用键。PRIMARYKEY约束(主键约束)用于实现实体完整性。通过PRIMARYKEY约束定义主键,一个表只能有一个PRIMARYKEY约束,且PRIMARYKEY约束不能取空值,SQLServer为主键自动创建唯一性索引,实现数据的唯一性。如果一个表的主键由单列组成,则该主键约束可定义为该列的列级约束或表级约束。如果主键由两个以上的列组成,则该主键约束必须定义为表级约束。10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)71.使用T-SQL创建与删除PRIMARYKEY约束1)使用T-SQL语句在创建表时创建PRIMARYKEY约束定义列级主键约束的语法格式如下:

语法格式:

[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]定义表级主键约束的语法格式如下:语法格式:

[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column_name[,…n])}10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)8说明:

PRIMARYKEY:定义主键约束的关键字。

constraint_name:指定约束的名称。如果不指定,系统会自动生成约束的名称。

CLUSTERED|NONCLUSTERED:定义约束的索引类型,CLUSTERED表示聚集索引,NONCLUSTERED表示非聚集索引,与CREATEINDEX语句中的选项相同。10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)9【例10.1】创建商品表Goods,分别对商品号创建列级和表级PRIMARYKEY约束,每级约束有指定和不指定约束名称两种情况。(1)定义列级主键约束,不指定约束名称.

USEStoreSalesCREATETABLEGoods(

GoodsID

char(4)NOTNULLPRIMARYKEY,

/*在列级定义主键约束,未指定约束名称*/

GoodsName

char(30)NOTNULL,

Classification

char(6)NOTNULL,

UnitPrice

moneyNOTNULL,

StockQuantity

intNOTNULL,

GoodsAfloat

intNOTNULL)

由于未指定约束名称,创建该表时系统自动生成的约束名称为:PK__Goods__663DA8C0B27C2FF5。10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)10(2)定义列级主键约束,指定约束名称

USEStoreSalesCREATETABLEGoods(

GoodsID

char(4)NOTNULLCONSTRAINTPK_GoodsIDPRIMARYKEY,

/*

在列级定义主键约束,指定约束名称为PK_GoodsID*/

GoodsName

char(30)NOTNULL,

Classification

char(6)NOTNULL,

UnitPrice

moneyNOTNULL,

StockQuantity

intNOTNULL,

GoodsAfloat

intNOTNULL)数据库原理与应用(SQLServer)1110.2.1PRIMARYKEY约束(3)定义表级主键约束,不指定约束名称.

USEStoreSalesCREATETABLEGoods(

GoodsID

char(4)NOTNULL,

GoodsName

char(30)NOTNULL,

Classification

char(6)NOTNULL,

UnitPrice

moneyNOTNULL,

StockQuantity

intNOTNULL,

GoodsAfloat

intNOTNULL,

PRIMARY

KEY(GoodsID)

/*在表级定义主键约束,未指定约束名称*/)

由于未指定约束名称,系统在创建该表时自动生成的约束名称为:PK__Goods__663DA8C078CE91F4。10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)12(4)定义表级主键约束,指定约束名称

USEStoreSalesCREATETABLEGoods(

GoodsID

char(4)NOTNULL,

GoodsName

char(30)NOTNULL,

Classification

char(6)NOTNULL,

UnitPrice

moneyNOTNULL,

StockQuantity

intNOTNULL,

GoodsAfloat

intNOTNULL,

CONSTRAINT

PK_GoodsIDPRIMARYKEY(GoodsID)

/*

在表级定义主键约束,指定约束名称为PK_GoodsID*/)10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)13【例10.2】创建OrderDetail表,对订单号、商品号创建PRIMARYKEY约束。由于主键由两个列组成,主键约束必须定义为表级约束,本例指定约束名称。USEStoreSalesCREATETABLEOrderDetail(

OrderID

char(6)NOTNULL,

GoodsID

char(4)NOTNULL,

SaleUnitPrice

moneyNOTNULL,

Quantity

intNOTNULL,

Total

moneyNOTNULL,

Discount

floatNOTNULL,

DiscountTotal

moneyNOTNULL,

CONSTRAINT

PK_OrderIDGoodsIDPRIMARYKEY(OrderID,GoodsID)

/*

必须在表级定义主键约束,指定约束名称为PK_OrderIDGoodsID*/)10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)142)使用T-SQL语句在修改表时创建PRIMARYKEY约束修改表时创建PRIMARYKEY约束使用ALTERTABLE的ADD子句。

语法格式:

ALTERTABLEtable_name

ADD[CONSTRAINTconstraint_name]

PRIMARYKEY

[CLUSTERED|NONCLUSTERED]

(column[,...n])【例10.3】创建Employee表后,删去商品号列的主键,通过修改表,对商品号列创建PRIMARYKEY约束。

USEStoreSalesALTERTABLEEmployeeADD

CONSTRAINT

PK_EmplIDPRIMARYKEY(EmplID)10.2.1PRIMARYKEY约束数据库原理与应用(SQLServer)153)使用T-SQL语句删除PRIMARYKEY约束删除PRIMARYKEY约束使用ALTERTABLE的DROP子句。

语法格式:

ALTERTABLEtable_name

DROPCONSTRAINTconstraint_name[,…n]

【例10.4】删除上例创建的PRIMARYKEY约束。

USEStoreSalesALTERTABLEEmployee

DROP

CONSTRAINTPK_EmplID

2.使用图形界面方式创建与删除PRIMARYKEY约束使用图形界面方式创建PRIMARYKEY约束参看第6章6.4.1节相关操作步骤。删除PRIMARYKEY约束操作为:在“对象资源管理器”中,选择dbo.Employee表,单击鼠标右键,在弹出的快捷菜单中选择“设计”命令,进入“表设计器”窗口,选中主键所对应的行,单击鼠标右键,在弹出的快捷菜单中选择“删除主键”命令即可。10.2.2UNIQUE约束数据库原理与应用(SQLServer)16UNIQUE约束(唯一性约束)指定一个或多个列的组合的值具有唯一性,以防止在列中输入重复的值,为表中的一列或者多列提供实体完整性。UNIQUE约束指定的列可以有空值,但PRIMARYKEY约束的列值不允许为空值,故PRIMARYKEY约束强度大于UNIQUE约束。通过UNIQUE约束定义唯一性约束,为了保证一个表非主键列不输入重复值,应在该列定义UNIQUE约束。PRIMARYKEY约束与UNIQUE约束主要区别如下:●一个表只能创建一个PRIMARYKEY约束,但可创建多个UNIQUE约束。●PRIMARYKEY约束的列值不允许为NULL,UNIQUE约束的列值可取NULL。●创建PRIMARYKEY约束时,系统自动创建聚集索引,创建UNIQUE约束时,系统自动创建非聚集索引。PRIMARYKEY约束与UNIQUE约束都不允许对应列存在重复值。10.2.2UNIQUE约束数据库原理与应用(SQLServer)171.使用T-SQL语句在创建表时创建UNIQUE约束定义列级唯一性约束的语法格式如下。语法格式:

[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED]

唯一性约束应用于多列时必须定义表级约束。

语法格式:

[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED](column_name[,…n])10.2.2UNIQUE约束数据库原理与应用(SQLServer)18说明:

UNIQUE:定义唯一键约束的关键字。

constraint_name:指定约束的名称。如果不指定,系统会自动生成约束的名称。

CLUSTERED|NONCLUSTERED:定义约束的索引类型,CLUSTERED表示聚集索引,NONCLUSTERED表示非聚集索引,与CREATEINDEX语句中的选项相同。【例10.5】创建Employee2表时,对身份证列创建UNIQUE约束。本例创建UNIQUE约束和PRIMARYKEY约束,均采用表级约束并指定约束名。10.2.2UNIQUE约束数据库原理与应用(SQLServer)19USEStoreSalesCREATETABLEEmployee2(

EmplID

char(4)NOTNULL,

IDCard

char(18)NOTNULL,

EmplName

char(8)NOTNULL,

Sex

char(2)NOTNULL,

Birthday

dateNOTNULL,

Address

char(20)NULL,

Wages

moneyNOTNULL,

DeptID

char(4)NOTNULL,

CONSTRAINT

PK_EmIDPRIMARYKEY(EmplID),

/*在表级定义主键约束*/

CONSTRAINT

UK_IDcardUNIQUE(IDCard)

/*在表级定义唯一性约束*/)10.2.2UNIQUE约束数据库原理与应用(SQLServer)202.使用T-SQL语句在修改表时创建UNIQUE约束修改表时创建UNIQUE约束的语法格式如下:

语法格式:

ALTERTABLEtable_name

ADD[CONSTRAINTconstraint_name]UNIQUE

[CLUSTERED|NONCLUSTERED]

(column[,...n])【例10.6】创建Goods表后,通过修改表,对商品名称列创建UNIQUE约束。

USEStoreSalesALTERTABLEGoodsADD

CONSTRAINT

UK_GdNameUNIQUE(GoodsName)10.2.2UNIQUE约束数据库原理与应用(SQLServer)213.使用T-SQL语句删除UNIQUE约束删除PRIMARYKEY约束或UNIQUE约束使用ALTERTABLE的DROP子句,其语法格式如下:

语法格式:

ALTERTABLEtable_name

DROPCONSTRAINTconstraint_name[,…n]

【例10.7】删除上例创建的UNIQUE约束。

USEStoreSalesALTERTABLEGoods

DROP

CONSTRAINTUK_GdName10.2.2UNIQUE约束2.使用图形界面方式创建与删除UNIQUE约束【例10.8】使用对象资源管理器,对Goods表的商品名列,创建UNIQUE约束。(1)启动SQLServerManagementStudio,在对象资源管理器中,展开“数据库”节点,选中“StoreSales”数据库,展开该数据库节点,展开“表”节点,选择“dbo.Goods”,单击鼠标右键,在弹出的快捷菜单中选择“设计”命令,进入“表设计器”窗口,选择“GoodsName”列,单击鼠标右键,在弹出的快捷菜单中选择“索引/键”命令,打开“索引/键”窗口。(2)单击“添加”按钮,在右边的“标识”属性区域的“(名称)”栏中输入唯一键的名称,这里是“UK_GoodsName”,在常规属性区域的“类型”栏中选择类型为“唯一键”,在常规属性区域的“列”栏后单击“

”按钮,选择要创建索引的列,这里选择“GoodsName”列,如图10.1所示。数据库原理与应用(SQLServer)2210.2.2UNIQUE约束数据库原理与应用(SQLServer)23(3)单击“关闭”按钮,保存修改,完成创建UNIQUE约束。如果要删除UNIQUE约束,打开如图10.2所示的“索引/键”窗口,选择要删除的UNIQUE约束,单击“删除”按钮,单击“关闭”按钮即可。数据库原理与应用(SQLServer)2410.2.3FOREIGNKEY约束表的一列或几列的组合的值在表中唯一地指定一行记录,选择这样的一列或多列的组合作为主键可实现表的实体完整性,通过定义PRIMARYKEY约束来创建主键。外键约束定义了表与表之间的关系,通过将一个表中一列或多列添加到另一个表中,创建两个表之间的连接,这个列就成为第二个表的外键(FOREIGNKEY,FK),通过定义FOREIGNKEY约束来创建外键。使用PRIMARYKEY约束或UNIQUE约束来定义主表的主键或唯一键,FOREIGNKEY约束来定义从表的外键,可实现主表与从表之间的参照完整性。在SQLServer中,主表又称主键表,从表又称外键表。定义表间参照关系的步骤如下:(1)首先定义主键表的主键(或唯一键)。(2)再定义外键表的外键。10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)251.使用T-SQL语句创建与删除表间参照关系1)使用T-SQL语句创建表间参照关系创建主键(PRMARYKEY约束)及唯一键(UNIQUE约束)的方法在前面已作介绍,这里仅介绍通过T-SQL语句创建外键的方法。(1)创建表时定义外键定义列级外键约束的语法格式如下:

语法格式:

[CONSTRAINTconstraint_name][FOREIGNKEY]REFERENCESref_table[NOTFORREPLICATION]10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)26定义表级外键约束的语法格式如下:

语法格式:

[CONSTRAINTconstraint_name]FOREIGNKEY(column_name[,…n])REFERENCESref_table[(ref_column[,…n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]][NOTFORREPLICATION]

说明:

FOREIGNKEY:定义外键约束的关键字。10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)27

constraint_name:指定约束的名称。如果不指定,系统会自动生成约束的名称。

ONDELETE{CASCADE|NOACTION}:指定参照动作采用DELETE语句进行删除操作,删除动作如下。CASCADE:当删除主键表中某行时,外键表中所有相应行自动被删除,即进行级联删除。NOACTION:当删除主键表中某行时,删除语句终止,即拒绝执行删除。NOACTION是默认值。

ONUPDATE{CASCADE|NOACTION}:指定参照动作采用UPDATE语句进行更新操作,更新动作如下。CASCADE:当更新主键表中某行时,外键表中所有相应行自动被更新,即进行级联更新。NOACTION:当更新主键表中某行时,更新语句终止,即拒绝执行更新。NOACTION是默认值。10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)28【例10.9】以商品表Goods、订单表SalesOrder为主键表,以订单明细表OrderDetail为外键表,实现参照完整性。(1)建立参照关系首先,以商品表Goods为主键表,通过PRIMARYKEY约束定义主键为GoodsID;以订单表SalesOrder为主键表,通过PRIMARYKEY约束定义主键为OrderID。以订单明细表OrderDetail为外键表,创建OrderDetail表,通过FOREIGNKEY约束定义外键,代码如下。USEStoreSalesCREATETABLEOrderDetail(

OrderID

char(6)NOTNULL,

GoodsID

char(4)NOTNULL,

SaleUnitPrice

moneyNOTNULL,

Quantity

intNOTNULL,

Total

moneyNOTNULL,

Discount

floatNOTNULL,

DiscountTotal

moneyNOTNULL,数据库原理与应用(SQLServer)29

CONSTRAINT

PK_OrderIDGoodsIDPRIMARYKEY(OrderID,GoodsID),

CONSTRAINT

FK_GoodsIDFOREIGNKEY(GoodsID)REFERENCESGoods(GoodsID)/*

OrderDetail为外键表,定义外键为GoodsID,参照主键表Goods,主键GoodsID*/

ONDELETENOACTION

/*当删除Goods表中某行时,拒绝执行删除*/

ON

UPDATECASCADE,

/*当更新Goods表中某行时,级联更新OrderDetail表中所有相应行*/

CONSTRAINT

FK_OrderIDFOREIGNKEY(OrderID)REFERENCESSalesOrder(OrderID)

/*

OrderDetail为外键表,定义外键为OrderID,参照主键表SalesOrder,主键OrderID*/

ONDELETECASCADE

/*当删除SalesOrder表中某行时,级联删除OrderDetail表中所有相应行*/

ON

UPDATENOACTION

/*当更新SalesOrder表中某行时,拒绝执行更新*/)10.2.3FOREIGNKEY约束10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)30(2)当删除Goods表中某行时,拒绝执行删除。删除Goods表GoodsID=’D001’的1行时,系统提示”您将要删除1行”,如图10.2所示。10.2.3FOREIGNKEY约束单击”是”按钮后,系统提示:DELETE语句与REFERENCE约束’FK_GoodsID’冲突,语句已终止,未删除任何行,如图10.3所示。数据库原理与应用(SQLServer)3110.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)32(3)当更新Goods表中某行时,级联更新OrderDetail表中所有相应行更新Goods表第1行GoodsID列,将’1001’更新为’1008’,如图10.4所示。查询OrderDetail表,其相应行的GoodsID列的’1001’已级联更新为’1008’,如图10.5所示。10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)33(2)通过修改表定义外键使用ALTERTABLE语句的ADD子句也可定义外键约束,语法格式与定义其它约束类似,此处略去。【例10.10】修改Employee表的定义,将它的“部门号”列定义为外键,假设Department表的“部门号”列已定义为主键。

ALTERTABLEEmployee

ADD

CONSTRAINTFK_DeptIDFOREIGNKEY(DeptID)REFERENCESDepartment(DeptID)

/*

Employee为外键表,定义外键为DeptID,参照主键表Department,主键DeptID*/10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)342)使用T-SQL语句删除表间参照关系使用T-SQL语句删除表间参照关系语法格式如下:

语法格式:

ALTERTABLEtable_name

DROPCONSTRAINTconstraint_name[,…n]

【例10.11】删除以上对Employee部门号列定义的FK_DeptID外键约束。

ALTERTABLEEmployee

DROP

CONSTRAINTFK_DeptID

10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)352.使用图形界面方式创建与删除表间参照关系1)使用图形界面方式创建表间参照关系使用图形界面方式创建表间参照关系举例如下:【例10.12】使用对象资源管理器,在StoreSales数据库中建立Department表和Employee表的参照关系。操作步骤如下:(1)按照前面介绍的方法定义主表主键,此处已定义Department表的DeptID列为主键。(2)启动SQLServerManagementStudio,在对象资源管理器中,展开“数据库”节点,选中“StoreSales”数据库,展开该数据库节点,选择“数据库关系图”,单击鼠标右键,在弹出的快捷菜单中选择“新建数据库关系图”命令,打开“添加表”窗口。(3)在出现的“添加表”窗口中选择要添加的表,这里选择Department表和Employee表,单击“添加”按钮,单击“关闭”按钮退出“添加表”窗口。10.2.3FOREIGNKEY约束(4)在“数据库关系图设计”窗口将鼠标指向主表的主键,并拖动到从表,这里将Department表的DeptID列拖动到从表Employee中的DeptID列。(5)在弹出的“表和列”窗口中输入关系名、设置主键表和列名、外键表和列名,如图10.6所示,单击“表和列”窗口中的“确定”按钮,再单击“外键关系”窗口中的“确定”按钮。数据库原理与应用(SQLServer)3610.2.3FOREIGNKEY约束(6)出现如图10.7所示的界面,单击“保存”按钮,在弹出的“选择名称”对话框中输入关系图名称Diagram_Department_Employee,单击“确定”按钮,在弹出的“保存”对话框中单击“是”按钮,完成表间参照关系的创建。数据库原理与应用(SQLServer)3710.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)382)使用图形界面方式删除表间参照关系使用图形界面方式删除表间参照关系举例如下:【例10.13】使用对象资源管理器,在StoreSales数据库中删除Department表和Employee表的参照关系。操作步骤如下:(1)在StoreSales数据库的“数据库关系图”目录下选择要修改的“关系图”,这里是“Diagram_Department_Employee”,单击鼠标右键,在弹出的快捷菜单中选择“修改”命令,打开“数据库关系图设计”Department窗口。10.2.3FOREIGNKEY约束数据库原理与应用(SQLServer)392)在“数据库关系图设计”窗口中,选择已经建立的“关系”,单击鼠标右键,选择“从数据库中删除关系”,如图10.8所示,在弹出的对话框中,单击“是”按钮,删除主表和从表参照关系。域完整性通过CHECK约束、DEFALUT约束、NOTNULL约束等实现。CHECK约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。创建与删除CHECK约束有两种方式:使用T-SQL语句和使用图形界面。10.2.4CHECK约束数据库原理与应用(SQLServer)401.

使用T-SQL语句创建与删除CHECK约束1.)使用T-SQL语句在创建表时创建CHECK约束

语法格式:

[CONSTRAINTconstraint_name]CHECK[NOTFORREPLICATION](logical_expression)说明:

(1)CONSTRAINTconstraint_name:指定约束名。(2)NOTFORREPLICATION:指定检查约束在把从其他表中复制的数据插入到表中时不发生作用。(3)logical_expression:指定检查约束的逻辑表达式。10.2.4CHECK约束数据库原理与应用(SQLServer)41【例10.14】创建商品表Goods,增加单价列的CHECK约束,要求单价不大于10000。

USEStoreSalesCREATETABLEGoods(

GoodsID

char(4)NOTNULLPRIMARYKEY,

GoodsName

char(30)NOTNULL,

Classification

char(6)NOTNULL,

UnitPrice

moneyNOTNULLCHECK(UnitPrice<=10000),

/*UnitPrice列只允许小于或等于10000*/

StockQuantity

intNOTNULL,

GoodsAfloat

intNOTNULL)GO

本例为列UnitPrice定义了列级检查约束,使其值必须小于或等于10000。10.2.4CHECK约束数据库原理与应用(SQLServer)422)使用T-SQL语句在修改表时创建CHECK约束使用ALTERTABLE

的ADD子句在修改表时创建CHECK约束的语法格式如下:

语法格式:

ALTERTABLEtable_name

ADD[<column_definition>]

[CONSTRAINTconstraint_name]CHECK(logical_expression)

【例10.15】修改Goods表,增加库存量列的CHECK约束,要求库存量不小于4。

USEStoreSalesALTERTABLEGoods

ADD

CONSTRAINTCK_StockQuantityCHECK(StockQuantity>=4)

/*

要求StockQuantity列大于或等于4*/

本例为列UnitPrice定义了列级检查约束,使其值必须大于或等于4。10.2.4CHECK约束数据库原理与应用(SQLServer)433)使用T-SQL语句删除CHECK约束使用ALTERTABLE语句的DROP子句删除CHECK约束的语法格式如下:

ALTERTABLEtable_name

DROPCONSTRAINTcheck_name

【例10.16】删除Goods表库存量列的CHECK约束。

USEStoreSalesALTERTABLEgoodsDROPCONSTRAINTCK_StockQuantity10.2.4CHECK约束数据库原理与应用(SQLServer)442.

使用图形界面方式创建与删除CHECK约束使用图形界面方式创建与删除CHECK约束举例如下:【例10.17】使用对象资源管理器,在员工表的性别列,创建一个性别只能取’男’或’女’的CHECK约束。操作步骤如下:(1)启动SQLServerManagementStudio,在对象资源管理器中,展开“数据库”节点,选中“StoreSales”数据库,展开该数据库节点,展开“表”节点,选择“dbo.Employee”,单击鼠标右键,在弹出的快捷菜单中选择“设计”命令,在打开的“表设计器”窗口中选择“Sex”列,右单击鼠标选择“CHECK约束”命令。10.2.4CHECK约束(2)在出现的“CHECK约束”窗口中单击“添加”按钮,添加一个“CHECK约束”,这里是“CK_Sex”,在“表达式”文本框后面单击

按钮,打开“CHECK约束表达式”窗口,编辑相应的CHECK约束表达式为:Sex

IN(‘男’,’女’)(也可直接在文本框中输入内容),单击“确定”按钮,返回到“CHECK约束”窗口,如图10.9所示。数据库原理与应用(SQLServer)4510.2.4CHECK约束数据库原理与应用(SQLServer)46(3)在“CHECK约束”窗口中,单击“关闭”按钮,保存对各项的修改,完成“CHECK约束”的创建。如果需要删除CHECK约束,在进入“CHECK约束”窗口后,选择需要删除的内容,单击“删除”按钮,再单击“关闭”按钮,完成“CHECK约束”的删除。10.2.5DEFALUT约束数据库原理与应用(SQLServer)47DEFALUT约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,当没有为某列指定数据时,自动指定列的值。在创建表时,可以创建DEFAULT约束作为表定义的一部分。如果某个表已经存在,则可以为其添加DEFAULT约束,表中的每一列都可以包含一个DEFAULT约束。默认值可以是常量,也可以是表达式,还可以为NULL值。

创建表时创建DEFALUT约束的语法格式如下:

语法格式:

[CONSTRAINTconstraint_name]DEFAULTconstant_expression[FORcolumn_name]10.2.5DEFALUT约束数据库原理与应用(SQLServer)48【例10.18】创建Employee表,建立DEFALUT约束。

USEStoreSalesGOCREATETABLEEmployee(

EmplID

char(4)NOTNULLPRIMARYKEY,

EmplName

char(8)NOTNULL,

Sex

char(2)NOTNULLDEFAULT'男',

/*定义Sex列DEFALUT约束值为'男'*/

Birthday

dateNOTNULL,

Address

char(20)NULL,

Wages

moneyNOTNULL,

DeptID

char(4)NOTNULLDEFAULT'D001'

/*定义DeptID列DEFALUT约束值为'D001'*/)GO10.2.5DEFALUT约束数据库原理与应用(SQLServer)49该语句执行后,为验证DEFALUT约束的作用,向Employee表插入一条记录('E008','孙杰','1989-04-28',NULL,3200),未指定Sex列、DeptID列。

USEStoreSalesINSERTINTOEmployee(EmplID,EmplName,Birthday,Address,Wages)VALUES('E008','孙杰','1989-04-28',NULL,3200)GO

通过以下SELECT语句进行查询。

USEStoreSalesSELECT*FROMEmployeeWHEREEmplID='E008'GO10.2.5DEFALUT约束数据库原理与应用(SQLServer)50查询结果:

EmplID

EmplName

Sex

Birthday

Address

Wages

DeptID----------------------

---------------------------

------------

-----------------E008

孙杰

1989-04-28

NULL

3200.00

D001

由于已创建Sex列DEFALUT约束值为'男'、DeptID列DEFALUT约束值为'D001',虽然在插入记录中未指定Sex列、DeptID列,SQLServer自动为上述二列分别插入字符值’男’和’D001’。10.3

应用举例数据库原理与应用(SQLServer)51【例10.19】应用实例要求如下(1)在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论