176 lines
4.5 KiB
Markdown
176 lines
4.5 KiB
Markdown
## 一、上机内容
|
||
|
||
\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_cno,fk_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种
|
||
|
||
|
||
|