mysql建立修改表存储过程_MySQL数据库创建、表的创建、存储过程、触发器

一、基本内容

(1) 使用SQL语句创建数据库;

(2) 为数据库分配管理权限;

(3) 定义表和数据库的完整性,student(学生表),course(课程表)和 sc(学生选课表),

并设置各个表之间的联系,设置表的主键和每个表对应的外键约束;

(4) 查看三个表的完整性,录入三个表的元组数据,观察设置外键的作用;

(5) 使用 select * from student... 等SQL语句进行数据的查询,观察实验结果

(6) 为eduTest数据库的基本表创建视图、索引,实现数据库的完整性操作;

(7) eduTest数据库,分配用户权限;

二、SQL语句

1.数据库的创建:

(1) 数据库创建代码:

CREATE DATABASE eduTest DEFAULT CHARACTER SET utf8;

(2)查询数据库:

SHOW DATABASES;

87b109caea0b87b0c8553ca2bbe8bcb3.png

image.png

(3) 修改数据库的默认字符集:

ALTER DATABASE eduTest DEFAULT CHARACTER SET utf8;

54c585f9e341cc6d7b2273bbddd26e08.png

image.png

ALTER DATABASE eduTest DEFAULT CHARACTER SET gbk;

17afb3c09068a6765e7d77a76fc557e1.png

image.png

2.数据库中表建立的代码:

(1)course表:

CREATE TABLE course(

id INT PRIMARY KEY AUTO_INCREMENT,

sname VARCHAR(20) NOT NULL UNIQUE,

presourse VARCHAR(20) NOT NULL,

remark VARCHAR(40)

);

1b1fdd8395831c89fd054acf533b6e9e.png

image.png

(2)student表:

CREATE TABLE student(

id INT PRIMARY KEY AUTO_INCREMENT,

sno INT(8) ZEROFILL NOT NULL,

sname VARCHAR(20) NOT NULL,

sId INT ,

CONSTRAINT student_course_fk FOREIGN KEY(sId) REFERENCES course(id)

);

24bd3eb6476c80145dad675703ca6fe0.png

image.png

(3)sc表

CREATE TABLE sc(

scId INT PRIMARY KEY AUTO_INCREMENT,

sno INT(8) ZEROFILL NOT NULL,

grade INT NOT NULL,

courseId INT NOT NULL,

remark VARCHAR(20),

CONSTRAINT sc_course_fk FOREIGN KEY(courseId) REFERENCES course(id)

);

4b1d853fe89bf21e508451a6216a5026.png

image.png

3. 外键的约束

c036ec396e857bc43f36462e03a4488e.png

image.png

由于courseId作为外键参考于course表的id,当添加的courseId的值在course表中id 不存在时,当前值是不能插入到数据库当中去的。

4.在数据库eduTest中创建视图便于对数据的保护:

(1)将student表中的某些字段单独提取出来作为给数据库用户使用的基本 表,便于对重要字段的素具进行保密:

Cs系的student_sc视图:

/*为每一个系的学生分别创建视图*/

CREATE VIEW student_sc AS SELECT student.* FROM student WHERE student.sdept='cs';

b2cb8f99a2bf9b7466fe8890571c0378.png

image.png

Is系的student_is视图:

CREATE VIEW student_is AS SELECT student.* FROM student WHERE student.sdept='is';

b7029741ba5a7d02ebe69810575604ca.png

image.png

Net系的student_net视图:

CREATE VIEW student_net AS SELECT student.* FROM student WHERE student.sdept='net';

86c890316b479743631c154572771f54.png

image.png

Soft系的student_soft视图:

CREATE VIEW student_soft AS SELECT student.* FROM student WHERE student.sdept='soft';

d91aba8a184df44178575ae54c7d89a8.png

image.png

5.视图的作用

(1)试图能够简化用户的操作;效果:视图机制使用户可以把主要的精力花费在数据上,而不是直接来自哪个基本表。

(2)视图能使用户从多种角度去分析数据的作用;

效果:在许多用户同时访问同一数据的时候比较重要。

(3)试图对重构的数据库提供了一定程度的逻辑性;

效果:可以增加表的字段,也可以在创建视图的时候摘要自己需要的数据项。

(4)试图能够对机密数据进行安全性保护;

效果:可以将机密的字段进行保护,可以不用显示给用户。

(5)适当的运用视图可以更清晰的表达查询;

6.创建数据库更新操作的日志表

/创建日志表信息对表操作完成后触发写进日志表/

CREATE TABLE text_log(

id INT PRIMARY KEY AUTO_INCREMENT,

opra_table VARCHAR(20) NOT NULL,

opra_type VARCHAR(20) NOT NULL,

opra_remark VARCHAR(20)

);

7.创建存储过程

/创建批插入的存储过程,触发插入操作对应的触发器/

DELIMITER $

CREATE PROCEDURE insert_student(IN sno_start INT, IN sno_end INT)

BEGIN

DECLARE i INT DEFAULT 0;

SET i=sno_start;

WHILE i<=sno_end DO

INSERT INTO student(sno,sname,sage,ssex,sdept)

VALUE(i,'安雨轩',18+i-sno_start,'女','net');

SET i=i+1;

END WHILE;

END

$

/创建批删除的存储过程,触发删除操作对应的触发器/

DELIMITER $

CREATE PROCEDURE delete_student(IN sno_start INT, IN sno_end INT)

BEGIN

DECLARE i INT DEFAULT 0;

SET i=sno_start;

WHILE i<=sno_end DO

DELETE FROM student WHERE student.sno=i;

SET i=i+1;

END WHILE;

END

$

8.触发器的创建:

/创建student表插入的触发器/

CREATE TRIGGER trigger_insert_student AFTER INSERT ON student FOR EACH ROW

INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');

/删除触发器pro_insert_student/

DROP TRIGGER trigger_insert_student;

/创建student表删除的触发器/

CREATE TRIGGER trigger_delete_student AFTER DELETE ON student FOR EACH ROW

INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','delete','删除');

/创建student_test表删除的触发器/

CREATE TRIGGER trigger_delete_student_test AFTER DELETE ON student_test FOR EACH ROW

INSERT INTOtext_log(opra_table,opra_type,opra_remark) VALUE('student','delete','删除');

DELETE FROM student_test WHERE student_test.sno=04151079;

/创建student_test表插入的触发器/

CREATE TRIGGER trigger_insert_student_test AFTER INSERT ON student_test FOR EACH ROW

INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');

/删除触发器pro_insert_student_test/

DROP TRIGGER trigger_insert_student_test;

SELECT * FROM text_log;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验的目的是掌握数据库存储过程触发器创建和应用,以及了解它们在实际应用中的作用。本实验使用的数据库MySQL。 一、实验环境 1. MySQL数据库 2. Navicat数据管理工具 二、实验步骤 1. 数据库建立 本实验中使用的数据库为sdut,可以通过Navicat工具新建一个MySQL数据库。 2. 学生创建 学生包含学号、姓名、性别、年龄、所在班级等字段,可以通过下面的SQL语句创建: ```sql CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), sex CHAR(2), age INT, class_id INT ); ``` 3. 学生的数据插入 可以使用下面的SQL语句向学生中插入一些数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('张三', '男', 18, 1), ('李四', '女', 19, 2), ('王五', '男', 20, 3), ('赵六', '女', 21, 1), ('钱七', '男', 22, 2); ``` 4. 存储过程创建 存储过程是一段预定义好的SQL语句集合,可以在需要时直接调用,可以减少数据库服务器的负担和网络传输的时间。本实验中创建一个存储过程,用于统计每个班级的学生总数。 ```sql CREATE PROCEDURE count_student() BEGIN SELECT class_id, COUNT(*) AS total FROM student GROUP BY class_id; END; ``` 上面的存储过程会查询学生中的数据,并按照班级进行分组,然后统计每个班级的学生总数。 5. 触发器创建 触发器是一段SQL语句,可以在数据库的某个操作(如插入、更新、删除)发生时自动触发执行。本实验中创建一个触发器,用于在学生中插入数据时自动更新班级中的学生总数。 ```sql CREATE TRIGGER update_class AFTER INSERT ON student FOR EACH ROW BEGIN UPDATE class SET total = total + 1 WHERE id = NEW.class_id; END; ``` 上面的触发器会在学生中插入数据时自动执行,将对应班级的学生总数加1。 6. 实验结果 可以通过以下两种方式验证存储过程触发器的正确性: (1)调用存储过程 可以使用下面的SQL语句调用存储过程: ```sql CALL count_student(); ``` 调用结果如下: ``` class_id | total ---------|------ 1 | 2 2 | 2 3 | 1 ``` 可以看到存储过程成功统计了每个班级的学生总数。 (2)插入数据 可以使用下面的SQL语句向学生中插入一条数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('孙八', '女', 23, 3); ``` 插入数据后,可以查询班级的数据,验证触发器是否成功更新了学生总数: ```sql SELECT * FROM class; ``` 查询结果如下: ``` id | name | total ---|------|------ 1 | 一班 | 2 2 | 二班 | 2 3 | 三班 | 2 ``` 可以看到触发器成功将三班的学生总数从1更新为2。 三、实验总结 本实验通过创建存储过程触发器,成功实现了统计班级学生总数和自动更新班级学生总数功能。存储过程触发器可以大大减少数据库服务器的负担和网络传输的时间,提高了数据库的性能和响应速度,是数据库管理中常用的技术手段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值