实验九 数据完整性约束实现
【实验目的与要求】
1. 熟练掌握实体完整性的实现。 2. 熟练掌握参照完整性的实现。 3. 熟练掌握域完整性的实现。
【实验内容与步骤】
实验准备:对于CPXS 数据库,若在CP 表、CPXSB 表和XSS 表上已有约束,请先删除之。
9.1. 实体完整性的实现
(1) 对CP 表,定义主键约束(用企业管理器实现)。
写出相应过程:
测试:试着对CP 表插入一条与原表中数据行具有相同主键值的数据。
给出测试结果:
(2)对CPXSB 表、XSS 表,定义主键约束(用SQL 语句实现,写出相应语句)。
给出相应的SQL 语句:
给出测试结果:
在XSS 中插入一条客户编号为’000005’的记录
9.2. 参照完整性的实现
(1)利用企业管理器建立CP 表与CPXSB 之间的参照关系,当对主表CP 表进行更新和删除操作时,从表CPXSB 采用NO ACTION方式,写出其过程。
给出相应的过程:
测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,给出测试结果。
(2)利用SQL 语句建立CPXSB 与XSS 表之间的参照关系,当对主表XSS 表进行更新和删除操作时,从表CPXSB 采用CASCADE (级联)方式,写出其过程。
给出相应的SQL 语句:
Foreign key (客户编号) references CPXSB(客户编号) On delete cascade On update cascade
测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,
给出测试结果。
XSS 表中的客户编号为000002的记录已被删除
思考:外键参照关系中CASCADE (级联)和NO ACTION方式的作用各是什么? 1.No Action 是不允许该操作执行。
2.CASCADE 是删除或者修改被参照表的一个元组造成了与参照表的不一致,则删除或者修改参照表中的所有造成不一致的元组。
9.3. 域完整性的实现 1.Unique 约束
(1)在CP 表的“产品名称”列定义一个唯一约束。
给出相应的SQL 语句:
alter table cp add unique(产品名称);
测试:试着在在CP 表中插入一条具有与原表中某记录相同“产品名称”值的数据。
给出测试结果:
(2)在CP 表的价格列上定义大于等于0的检查(CHECK )约束。
给出相应的SQL 语句:
alter table cp add constraint c1 check(价格>0);
测试:试着在CP 表中插入一条记录,其“价格”字段的值小于0(如: -2),给出测试结果:
(3)定义一个大于等于5的规则check_kcl,并将其绑定到CP 表的库存量列,
给出相应的SQL 语句:
alter table cp add constraint check_kcl check(库存量>=5);
测试:试着在CP 表中插入一条记录,其“库存量”字段的值小于5(如:2) ,给出测试结果:
(4)解除(3)中绑定,删除该规则,请写出相关SQL 语句。
给出相应的SQL
语句和运行结果截图:
测试:试着在CP 表中插入一条记录,其“库存量”字段的值小于5(如:2) ,给出测试结果:
思考:比较(3)和(4)的测试结果,理解自定义完整性(约束) 的作用?
可以检验插入元组或者修改属性的值满不满足条件
9.4. 完成以下实验练习
(1) 设定XSS 表中的地区值只能是“镇江”,“无锡”,“上海”,“南京”,“厦门”中的任意一个,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
alter table xss add constraint c2 check(地区='厦门' or 地区='镇江' or 地区='无锡
' or 地区='上海' or 地区='南京');
测试:试着在XXS 表中插入一条记录,其“地区”字段的值为福州。
给出测试结果:
(2) 用户要求:在输入XSS 表中的数据时,若“地区”列没有提供数据,系统应自动取值“厦门”,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
通过表格直接设置,对应的语句是:[地区] [char](10) NULL CONSTRAINT
[DF_XSS_地区] DEFAULT ('厦门'),
测试:试着在XXS 表中插入一条记录,其“地区”字段的值为空。而后查询插入的数据。
给出测试结果:
插入一条地区为空的数据:
发现变成这样了:
(3) 用户要求:CPXSB 表中的“数量”列的取值只能为1—20之间的整数,且在用户没有输入数据时自动取值1,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
通过表格设置,对应的语句:
[数量] [int] NULL CONSTRAINT [DF_CPXSB_数量] DEFAULT ((1)),
范围的对应的语句是:alter table CPXSB add constraint B1 check(数量 between 1 and 20);
测试:试着在CPXSB 表中插入一条记录,其“数量”字段的值为45。
给出测试结果:
测试:试着在CPXSB 表中插入一条记录,其“数量”字段的值为空。而后查询插入的数据。
给出测试结果:
插入一条数量为空的数据:
出现的结果为:
实验九 数据完整性约束实现
【实验目的与要求】
1. 熟练掌握实体完整性的实现。 2. 熟练掌握参照完整性的实现。 3. 熟练掌握域完整性的实现。
【实验内容与步骤】
实验准备:对于CPXS 数据库,若在CP 表、CPXSB 表和XSS 表上已有约束,请先删除之。
9.1. 实体完整性的实现
(1) 对CP 表,定义主键约束(用企业管理器实现)。
写出相应过程:
测试:试着对CP 表插入一条与原表中数据行具有相同主键值的数据。
给出测试结果:
(2)对CPXSB 表、XSS 表,定义主键约束(用SQL 语句实现,写出相应语句)。
给出相应的SQL 语句:
给出测试结果:
在XSS 中插入一条客户编号为’000005’的记录
9.2. 参照完整性的实现
(1)利用企业管理器建立CP 表与CPXSB 之间的参照关系,当对主表CP 表进行更新和删除操作时,从表CPXSB 采用NO ACTION方式,写出其过程。
给出相应的过程:
测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,给出测试结果。
(2)利用SQL 语句建立CPXSB 与XSS 表之间的参照关系,当对主表XSS 表进行更新和删除操作时,从表CPXSB 采用CASCADE (级联)方式,写出其过程。
给出相应的SQL 语句:
Foreign key (客户编号) references CPXSB(客户编号) On delete cascade On update cascade
测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,
给出测试结果。
XSS 表中的客户编号为000002的记录已被删除
思考:外键参照关系中CASCADE (级联)和NO ACTION方式的作用各是什么? 1.No Action 是不允许该操作执行。
2.CASCADE 是删除或者修改被参照表的一个元组造成了与参照表的不一致,则删除或者修改参照表中的所有造成不一致的元组。
9.3. 域完整性的实现 1.Unique 约束
(1)在CP 表的“产品名称”列定义一个唯一约束。
给出相应的SQL 语句:
alter table cp add unique(产品名称);
测试:试着在在CP 表中插入一条具有与原表中某记录相同“产品名称”值的数据。
给出测试结果:
(2)在CP 表的价格列上定义大于等于0的检查(CHECK )约束。
给出相应的SQL 语句:
alter table cp add constraint c1 check(价格>0);
测试:试着在CP 表中插入一条记录,其“价格”字段的值小于0(如: -2),给出测试结果:
(3)定义一个大于等于5的规则check_kcl,并将其绑定到CP 表的库存量列,
给出相应的SQL 语句:
alter table cp add constraint check_kcl check(库存量>=5);
测试:试着在CP 表中插入一条记录,其“库存量”字段的值小于5(如:2) ,给出测试结果:
(4)解除(3)中绑定,删除该规则,请写出相关SQL 语句。
给出相应的SQL
语句和运行结果截图:
测试:试着在CP 表中插入一条记录,其“库存量”字段的值小于5(如:2) ,给出测试结果:
思考:比较(3)和(4)的测试结果,理解自定义完整性(约束) 的作用?
可以检验插入元组或者修改属性的值满不满足条件
9.4. 完成以下实验练习
(1) 设定XSS 表中的地区值只能是“镇江”,“无锡”,“上海”,“南京”,“厦门”中的任意一个,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
alter table xss add constraint c2 check(地区='厦门' or 地区='镇江' or 地区='无锡
' or 地区='上海' or 地区='南京');
测试:试着在XXS 表中插入一条记录,其“地区”字段的值为福州。
给出测试结果:
(2) 用户要求:在输入XSS 表中的数据时,若“地区”列没有提供数据,系统应自动取值“厦门”,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
通过表格直接设置,对应的语句是:[地区] [char](10) NULL CONSTRAINT
[DF_XSS_地区] DEFAULT ('厦门'),
测试:试着在XXS 表中插入一条记录,其“地区”字段的值为空。而后查询插入的数据。
给出测试结果:
插入一条地区为空的数据:
发现变成这样了:
(3) 用户要求:CPXSB 表中的“数量”列的取值只能为1—20之间的整数,且在用户没有输入数据时自动取值1,请问如何解决该问题?请写出一种具体的解决方法。
给出相应的SQL 语句:
通过表格设置,对应的语句:
[数量] [int] NULL CONSTRAINT [DF_CPXSB_数量] DEFAULT ((1)),
范围的对应的语句是:alter table CPXSB add constraint B1 check(数量 between 1 and 20);
测试:试着在CPXSB 表中插入一条记录,其“数量”字段的值为45。
给出测试结果:
测试:试着在CPXSB 表中插入一条记录,其“数量”字段的值为空。而后查询插入的数据。
给出测试结果:
插入一条数量为空的数据:
出现的结果为: