MySQL利用视图插入修改删除数据

1. 准备

已有数据库stu,数据表student、course、score:

create database stu;
use stu;

create table student(
sid char(4) primary key,
sname varchar(20) not null,
sex enum('男','女'),
birth date,
grade year,
department enum('信息工程系','化学工程系','机械电子系') default '信息工程系',
addr varchar(50)
)charset=utf8mb4;

create table course(
cno char(2) primary key,
cname varchar(20) not null,
start int,
credit float
)charset=utf8mb4;

create table  score(
scid int primary key auto_increment ,
sid char(4),
cno char(2),
result float  check(result >= 0 and result <= 100)
)charset=utf8mb4;

2.创建视图

create view  v1
as 
select sid,sname,sex,department,year(now())-year(birth) age
from student where department='化学工程系';

create view  v2
as 
select sid,sname,sex,department
from student where department='化学工程系';

create view v3
as 
select student.sid,sname,course.cno,cname,result
from student,score,course
where student.sid=score.sid and course.cno=score.cno;

3.插入数据

利用v1插入记录:

insert v1(sid,sname,sex,department)values('8888','张敏敏','女','信息工程系');

插入失败,错误提示:
Error Code: 1471. The target table v1 of the INSERT is not insertable-into

利用v2插入记录:

insert v2(sid,sname,sex,department)values('8888','张敏敏','女','信息工程系');

插入成功。
v1和v2相比,v1比v2多了个字段计算年龄的表达式year(now())-year(birth)。
插入失败可能原因1:定义视图的select语句后面有数学表达式或聚合函数。

利用v3插入记录

insert v3 values('8888','张敏敏','01','大学英语',90);

Error Code: 1394. Can not insert into join view ‘stu.v3’ without fields list

insert v3(cno,cname) values('55','人工智能');

插入成功
插入失败可能原因2:视图是定义在多个表上,通过视图插入一条记录可能是在多个表中插入记录。

定义视图v4,并在v4上定义视图v5、v6

create  view v4
as
select sid,cno,result
from score
where result>=70 ;

create  view v5
as
select sid,cno,result
from v4
where result<=90 with local check option ;

create  view v6
as
select sid,cno,result
from v4
where result<=90 with cascaded check option ;

利用v4插入记录,不管是否满足result>=70,均可插入:

insert v4 values('0404','01',60);
insert v4 values('0404','02',80);

利用v5插入记录:

insert v5 values('0405','01',60);
insert v5 values('0405','02',95);
insert v5 values('0405','03',80);

成绩为60、80均可插入,95插入失败:Error Code: 1369. CHECK OPTION failed ‘stu.v5’。因为在v5定义的时候有with local check option,必须满足视图v5本身定义的条件result<=90,对v4的条件result>=70不做要求。
with local check option 只要求满足该视图本身定义的条件

利用v6插入数据:

insert v6 values('0406','01',60);
insert v6 values('0406','02',95);
insert v6 values('0406','03',80);

只有成绩为80的记录插入成功,60和95均失败,因为在定义v6的时候有with cascaded check option,所以v6和v4定义的条件都必须满足。
with cascaded check option 要求满足所有视图和表定义的条件

插入失败可能原因3:插入记录不满足视图定义的基本条件。
在定义视图时select语句中含distinct、union、top、group by等短语时,插入记录也可能失败,不再举例。

4.修改记录、删除记录

利用v2修改学号8888为6688:

update v1 set sid='6688' where sid='8888';

不报错,不修改数据。提示为:0 row(s) affected Rows matched: 0 Changed: 0 Warnings: 0

利用v2删除8888记录:
delete from v2 where sid=‘8888’;
不报错、不删除。
如果修改v2定义去掉department=‘化学工程系’,则允许修改、允许删除:

create or replace view  v2
as 
select sid,sname,sex,department
from student;
update v2 set sid='6688' where sid='8888';
delete from v2 where sid='6688';

利用视图修改数据、删除数据时,不满足视图定义条件都不能修改或删除。不报错

5.总结:

利用视图插入数据时:
1.定义视图的select语句后面有数学表达式或聚合函数;
2.视图是定义在多个表上,通过视图插入一条记录是在多个表中插入记录;
3.视图定义时带‘with… check option’,不满足视图定义的条件;
4.视图带distinct、union、top、group by等短语时;
都可能导致插入记录失败。
利用视图修改数据、删除数据时,不满足视图定义条件都不能修改或删除。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验主要涉及 MySQL 数据库视图和触发器的创建和管理。视图是虚拟的表,是从一个或多个基本表导出的结果集。视图本身不包含数据,而是使用基本表数据创建的。可以通过视图查看和操作基本表数据。触发器是与表相关联的特殊类型的存储过程,当特定的数据库操作(如插入、更新、删除)在表上执行时,会自动触发触发器的执行。 具体实验步骤如下: 1.创建视图:可以使用CREATE VIEW语句创建视图,语法如下: ``` CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; ``` 其,view_name为视图名称,column1, column2, ...为要在视图显示的列名,table_name为基本表名称,condition为筛选条件。 2.修改视图:可以使用ALTER VIEW语句修改视图,语法如下: ``` ALTER VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; ``` 其,view_name为要修改视图名称,column1, column2, ...为要在视图显示的列名,table_name为基本表名称,condition为筛选条件。 3.插入修改删除视图数据:可以使用INSERT、UPDATE、DELETE语句插入修改删除视图数据,语法与基本表操作相同。 4.创建触发器:可以使用CREATE TRIGGER语句创建触发器,语法如下: ``` CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name FOR EACH ROW BEGIN -- 触发器执行的代码 END; ``` 其,trigger_name为触发器名称,BEFORE/AFTER表示在触发事件前或后执行触发器代码,INSERT/UPDATE/DELETE表示在执行相应操作时触发触发器,table_name为触发器绑定的基本表名称,FOR EACH ROW表示对每一行数据都执行触发器代码。 5.管理触发器:可以使用DROP TRIGGER语句删除触发器,语法如下: ``` DROP TRIGGER trigger_name; ``` 其,trigger_name为要删除的触发器名称。 以上就是本实验的主要原理和步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值