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

课上实训 3个表+16道题

police(pno警号,pid身份证号)

SQL数据库实操 第五波 完整性约束和触发器_第1张图片

pcase(cno案件编号,cname案件名称,ctype案件类型,cbrief案件简介)

SQL数据库实操 第五波 完整性约束和触发器_第2张图片

pc(pno警号,cno案件编号,ptime出警时间)

SQL数据库实操 第五波 完整性约束和触发器_第3张图片  

1.请用SQL 语句和对象资源管理器两种方法定义Police表的主键Pno;删除已经输入的某一记录的主键值,分析:为什么Pno置为‘    ’没有违反非空约束?

alter table police

add constraint pno_pk primary key(pno)

SQL数据库实操 第五波 完整性约束和触发器_第4张图片

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

 2.检查语句:update Police set Pno= NULL  where Pno=‘100001’,分析其是否正确?

不正确,pno是主键,不允许为空值

3.将案件表Case的Cno字段定义为主键,约束名称为Cno_pk;

alter table pcase

 add constraint Con_pk primary key(cno)

SQL数据库实操 第五波 完整性约束和触发器_第6张图片

 4.为Case表中的字段Cname添加唯一值约束;

alter table pcase

 add constraint Cname_pk unique(cname)

SQL数据库实操 第五波 完整性约束和触发器_第7张图片

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

alter table pc

 add constraint PC_pk primary key(pno,cno)

SQL数据库实操 第五波 完整性约束和触发器_第8张图片

 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数据库实操 第五波 完整性约束和触发器_第9张图片

 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数据库实操 第五波 完整性约束和触发器_第10张图片

 8.定义Police表中警员年龄Page在18~60范围内取值;

alter table police

 add constraint age_pk check(page>17 and page<61)

SQL数据库实操 第五波 完整性约束和触发器_第11张图片

 9.定义Police表中警员性别列Psex中只能输入“男”或“女”;

alter table police

 add constraint sex_pk1 check(psex in ('男','女'))

SQL数据库实操 第五波 完整性约束和触发器_第12张图片

 10.定义Police表中警员性别默认值为“男”;

alter table police

add constraint sex_pk default '男' for psex

SQL数据库实操 第五波 完整性约束和触发器_第13张图片

 11.删除Police表的年龄范围的约束条件;

alter table police

 drop constraint age_pk

SQL数据库实操 第五波 完整性约束和触发器_第14张图片

 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数据库实操 第五波 完整性约束和触发器_第15张图片

 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数据库实操 第五波 完整性约束和触发器_第16张图片

 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数据库实操 第五波 完整性约束和触发器_第17张图片

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

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数据库实操 第五波 完整性约束和触发器_第19张图片

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

如果建立触发器语句中不存在rollback transaction,即不能回滚,就是删除了之后也不能倒回去,不能实现禁止删除的功能,当建立触发器语句中存在rollback transaction时,就可以在触发事件后回滚到原来的状态,实现了禁止删除的功能

16.创建触发器T3实现向Police表中插入数据时查询全部数据。

create trigger T3 on police

for insert

as

begin

select * from police

endSQL数据库实操 第五波 完整性约束和触发器_第21张图片

验证成功

SQL数据库实操 第五波 完整性约束和触发器_第22张图片

你可能感兴趣的:(SQL数据库,sql,数据库)