SQL数据库|SQL数据库实操 第五波 完整性约束和触发器

课上实训 3个表+16道题
police(pno警号,pid身份证号)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

pcase(cno案件编号,cname案件名称,ctype案件类型,cbrief案件简介)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

pc(pno警号,cno案件编号,ptime出警时间)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

1.请用SQL 语句和对象资源管理器两种方法定义Police表的主键Pno;删除已经输入的某一记录的主键值,分析:为什么Pno置为‘’没有违反非空约束?
alter table police
add constraint pno_pk primary key(pno)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

‘’看着是空值,实际并不是,实际上是varchar类型,比如一个简单的python语句即可说明SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片



2.检查语句:update Police set Pno= NULLwhere Pno=‘100001’,分析其是否正确?
不正确,pno是主键,不允许为空值
3.将案件表Case的Cno字段定义为主键,约束名称为Cno_pk;
alter table pcase
add constraint Con_pk primary key(cno)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

4.为Case表中的字段Cname添加唯一值约束;
alter table pcase
add constraint Cname_pk unique(cname)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

5.将PC表的Pno及Cno字段组合定义为主键,约束名称为PC_pk;

alter table pc
add constraint PC_pk primary key(pno,cno)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

6.对于数据表PC的Pno、Cno字段定义为外码,使之与Police表的主码Pno及表Case表的主码Cno对应,通过数据库关系图实现如下参照完整性:
(1)删除Policeman表中记录的同时删除PC表中与该记录Pno字段值相同的记录;
(2)修改Case表Cno字段值时,该字段在PC表中的对应值也应修改。
create table pc1
(pno varchar(10),
cno varchar(12),
foreign key(pno) references police(pno)
on delete cascade,
foreign key(cno) references pcase(cno)
on update cascade
)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

7.定义check约束,要求警号Pno必须为6位数字字符,6位数字字符都在0~9中取值;
alter table police
add constraint tel_pk check(pno like ('[0-9][0-9][0-9][0-9][0-9][0-9]'))
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

8.定义Police表中警员年龄Page在18~60范围内取值;
alter table police
add constraint age_pk check(page>17 and page<61)
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

9.定义Police表中警员性别列Psex中只能输入“男”或“女”;
alter table police
add constraint sex_pk1 check(psex in ('男','女'))
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

10.定义Police表中警员性别默认值为“男”;
【SQL数据库|SQL数据库实操 第五波 完整性约束和触发器】alter table police
add constraint sex_pk default '男' for psex
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

11.删除Police表的年龄范围的约束条件;
alter table police
drop constraint age_pk
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

12.修改Police表警员的警号必须为6为数字字符的约束,改为7位0-9之间的数字字符;

alter table police
drop constraint tel_pk;
alter table police
add constraint tel_pk check(pno like ('[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'));
这里我失败了,sql语句没有出错,drop删除约束能正常运行,但是创建7位数字字符约束时失败了
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

csdn上说要么删除数据,要么手动创建约束,把“在创建或重新启用时检查现有数据”默认为“是”把它设置为 否

13.删除在cases表上设置的唯一值约束、以及police表上设置的所有check约束;
alter table pcase
drop Cname_pk;
alter table police
drop constraint age_pk,sex_pk,sex_pk1,tel_pk;
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

14.在Police表建立触发器T1,要求:当在警员信息中添加、删除或修改信息后,显示各不同警衔的警员人数;
create trigger T1 on police
after delete,insert,update
as
begin
select prank,count(prank) from police group by prank
end
SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

验证成功SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片


15.建立触发器T2,要求Police数据表中禁止删除“100001”警号的警员信息,分析当建立触发器语句中存在rollback transaction与否的区别;
create trigger T2 on police
instead of delete
as
if exists (select * from deleted where pno='100001')
begin
print'no!'
rollback transaction
endSQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

验证成功SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片



如果建立触发器语句中不存在rollback transaction,即不能回滚,就是删除了之后也不能倒回去,不能实现禁止删除的功能,当建立触发器语句中存在rollback transaction时,就可以在触发事件后回滚到原来的状态,实现了禁止删除的功能
16.创建触发器T3实现向Police表中插入数据时查询全部数据。
create trigger T3 on police
for insert
as
begin
select * from police
endSQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片

验证成功

SQL数据库|SQL数据库实操 第五波 完整性约束和触发器
文章图片


    推荐阅读