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

176 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 一、上机内容
\1. 创建students数据库在该数据库下创建表stu并同时创建约束表结构及约束要求如表1所示。
表1 stu的表结构
| 字段 | 类型 | 是否为空 | 约 束 |
| -------- | ------- | -------- | ----- |
| 学号 | char(4) | 否 | 主键 |
| 姓名 | char(8) | 是 | |
| 性别 | char(2) | 是 | |
| 出生日期 | date | 是 | |
```sql
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 |
设置(学号,课号)为主键。
```sql
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 | 是 | |
```sql
CREATE TABLE course
(
`课号` CHAR(4) NOT NULL,
`课名` CHAR(20) NULL,
`学分` INT NULL,
CONSTRAINT up_cname UNIQUE(`课名`)
);
```
\4. 在course表的课号列建立主键约束。
```sql
alter table course add primary key(课号);
```
\5. 在sc表的课号列建立外键约束fk_cno参照course表的课号列的取值要求实现级联更新。
```sql
alter table sc add constraint fk_cno foreign key(课号) references course(课号) on update cascade;
```
\6. 在stu表的姓名列建立唯一约束名uq_sname。
```sql
alter table stu add constraint uq_sname unique(姓名);
```
\7. 在course表的学分列建立检查约束ck_xf检查条件为学分>0。
```sql
alter table course add constraint ck_xf check (学分>0);
```
\8. 删除sc表的外键约束fk_cnofk_sno。
```sql
alter table sc drop constraint fk_cno;
alter table sc drop constraint fk_sno;
```
\9. 删除stu表的主键约束。
```sql
alter table stu drop primary key;
```
10.删除course表的唯一约束uq_cname。
```sql
alter table course drop index uq_cname;
```
11.创建测试表test包含一个字段date_time字段类型varchar(50)
```sql
create table test(
date_time varchar(50)
);
```
创建触发器test_trig实现在stu表中每插入一条学生记录后则自动在test表中追加一条插入成功时的日期时间。SYSDATE()函数用来获取当前的日期和时间。
```sql
create trigger test_trig
before insert on stu
for each row
insert test values(sysdate());
```
为stu表插入一条记录引发触发器查看test表的内容。
```sql
insert into stu values('2085','王五','男','2002-02-02');
select data_time from test;
```
12.在course表上创建触发器del_trig当course表上删除一门课程时级联删除sc表该课程的记录。
```sql
create trigger del_trig
before delete on course
for each row
delete from sc where sc.课号=old.课号;
```
删除course表的一条记录查看sc表相应记录是否被自动删除。
```sql
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种