Note/大学笔记/数据库系统原理/练习题/第四次上级.md

4.5 KiB
Raw Blame History

一、上机内容

\1. 创建students数据库在该数据库下创建表stu并同时创建约束表结构及约束要求如表1所示。

表1 stu的表结构

字段 类型 是否为空 约 束
学号 char(4) 主键
姓名 char(8)
性别 char(2)
出生日期 date
CREATE TABLE `stu`  (
  `学号` varchar(4) NOT NULL,
  `姓名` varchar(8),
  `性别` varchar(2),
  `出生日期` date,
  PRIMARY KEY (`学号`) USING BTREE
)

\2. 创建表sc并同时创建约束表结构及约束要求如表2所示。

表2 sc的表结构

字段 类型 是否为空 约 束
学号 char(4) 外键参照stu表的学号列约束名fk_sno)
课号 char(4)
成绩 decimal(5,2) 0≦成绩≦100

设置(学号,课号)为主键。

CREATE TABLE sc  (
  `学号` varchar(4) NULL ,
  `课号` varchar(4) NULL,
  `成绩` decimal(5, 2) NOT NULL CHECK(0<=成绩<=100),
  PRIMARY KEY (`学号`,`课号`)
  CONSTRAINT `fk_sno` FOREIGN KEY (`学号`) REFERENCES `students`.`stu` (`学号`)
);

\3. 创建表course并同时创建约束表结构及约束要求如表3所示。

表3 course的表结构

字段 类型 是否为空 约 束
课号 char(4)
课名 char(20) 唯一约束约束名uq_cname)
学分 int
CREATE TABLE course
(
`课号` CHAR(4) NOT NULL, 
`课名` CHAR(20) NULL,
`学分` INT NULL,
CONSTRAINT up_cname UNIQUE(`课名`)
);

\4. 在course表的课号列建立主键约束。

alter table course add primary key(课号);

\5. 在sc表的课号列建立外键约束fk_cno参照course表的课号列的取值要求实现级联更新。

alter table sc add constraint fk_cno foreign key(课号) references course(课号) on update cascade;

\6. 在stu表的姓名列建立唯一约束名uq_sname。

alter table stu add constraint uq_sname unique(姓名);

\7. 在course表的学分列建立检查约束ck_xf检查条件为学分>0。

alter table course add constraint ck_xf check (学分>0);

\8. 删除sc表的外键约束fk_cnofk_sno。

alter table sc drop constraint fk_cno;
alter table sc drop constraint fk_sno;

\9. 删除stu表的主键约束。

alter table stu drop primary key;

10.删除course表的唯一约束uq_cname。

alter table course drop index uq_cname;

11.创建测试表test包含一个字段date_time字段类型varchar(50)

create table test(
	date_time varchar(50)
);

创建触发器test_trig实现在stu表中每插入一条学生记录后则自动在test表中追加一条插入成功时的日期时间。SYSDATE()函数用来获取当前的日期和时间。

create trigger test_trig 
before insert on stu 
for each row
insert test values(sysdate());

为stu表插入一条记录引发触发器查看test表的内容。

insert into stu values('2085','王五','男','2002-02-02');

select data_time from test;

12.在course表上创建触发器del_trig当course表上删除一门课程时级联删除sc表该课程的记录。

create trigger del_trig
before delete on course
for each row
delete from sc where sc.课号=old.课号;

删除course表的一条记录查看sc表相应记录是否被自动删除。

insert into sc values('2085','01',88);
insert into course values('01','数据库',98);

delete from course where 课号='01';

select * from sc;
select * from course;

二、实验思考

1.请说明唯一约束和主键约束之间的联系和区别。

一张表里只能有一个主键约束,可以有多个唯一约 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值

2.在course表中插入一条学分值小于0的记录该记录能插入成功吗

不能

3.建立外键约束所参照的父表的列必须建立成主键吗?

4.可以建立几种类型的触发器?

3种