mysql8基础(八)视图和触发器

发布时间:2026/9/10 9:21:43
mysql8基础(八)视图和触发器 一、视图视图是虚拟的表是select查询返回的结果。两大特点1.简便2.安全(可以决定显示哪些信息隐藏哪些信息)。语句格式如下CREATE [OR REPLACE] [ALGORITHM {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]其中OR REPLACE必须拥有drop视图权限用来替换视图如果视图不存在则创建存在则替换。ALGORITHM定义算法有三种属性MERGE合并处理、TEMPTABLE临时表、UNDEFINED未定义会自动选择前两者之一做算法在未指定algotithm情况下默认为undefined。WITH CHECK OPTION决定检查范围两种属性CASCADED、LOCAL不指定情况下默认为cascaded。示例先建两张表并插入数据CREATETABLEt1(idINTPRIMARYKEYAUTO_INCREMENT,NAMEVARCHAR(10),ageINT);INSERTINTOt1VALUES(NULL,张三,50),(NULL,李四,32),(NULL,王五,37);CREATETABLEt2(idINTPRIMARYKEYAUTO_INCREMENT,sexCHAR(5),salaryINT);INSERTINTOt2VALUES(NULL,男,5000),(NULL,女,6200),(NULL,男,86000);两表联合查询只显示两表id和t1的name列、t2的sex列。SELECTt1.id,t1.name,t2.id,t2.sexFROMt1,t2WHEREt1.idt2.id以此返回结果建立视图CREATEVIEWt1_t2ASSELECTt1.id,t1.name,t2.id,t2.sexFROMt1,t2WHEREt1.idt2.id;报错报错原因存在相同列名改下别名就行CREATEVIEWt1_t2ASSELECTt1.id,t1.name,t2.idASt2_id,t2.sexFROMt1,t2WHEREt1.idt2.id;创建成功查看视图SELECT*FROMt1_t2格式和查询表相同既然是虚拟表当然也可以增删改。插入数据至视图INSERTINTOt1_t2(NAME,sex)VALUES(赵六,男)执行报错提示不能通过视图修改多个基表对分属两张表的字段分别测试插入INSERTINTOt1_t2(NAME)VALUES(赵六);INSERTINTOt1_t2(sex)VALUES(男);插入成功查看视图查看两张基表可见对视图添加数据也能影响到基表。测试更新UPDATEt1_t2SETNAME张三丰WHEREt2_id1;UPDATEt1_t2SETsex男WHEREid2;同样对视图的基表产生作用。测试删除因为此视图有两张基表是不能做数据删除操作的单表可以。下面就更改视图变为单张基表再对视图数据进行删除。ALTERVIEWt1_t2(编号,姓名)ASSELECTid,NAMEFROMt1;DELETEFROMt1_t2WHERE编号2;DELETEFROMt1_t2WHERE编号4;更改视图依然是使用alter因为视图中改了列名所以id变成编号。查看视图查看基表因为视图和表存放在一起显示视图和显示表一样SHOWTABLES删除视图也和删除表类似DROPVIEWt1_t2删除视图不会对基表的数据产生影响。不是所有视图都可以 INSERT / UPDATE / DELETE只有满足可更新条件的视图才可以。二、触发器触发器是与表有关的数据库对象是在增删改动作前后触发并执行触发器中定义的语句集合可以理解为对某些事件的监听并做出响应。CREATE TRIGGER trigger_name 触发器名trigger_time触发时间包括before、aftertrigger_event(触发事件包括insert、update、delete)ON tbl_name 监听的表名FOR EACH ROWtrigger_stmtsql语句示例先建一张emp表CREATETABLEemp(idINTPRIMARYKEYAUTO_INCREMENT,NAMEVARCHAR(10),ageINT,salaryINT);再建一张日志表存放emp表的操作信息CREATETABLEemp_log(idINT(11)PRIMARYKEYAUTO_INCREMENT,opVARCHAR(20)NOTNULLCOMMENT操作类型i/u/d,op_timeDATETIMENOTNULLCOMMENT操作时间,op_idINT(11)NOTNULLCOMMENT操作ID,op_paramsVARCHAR(500)COMMENT操作参数)创建一个针对emp表插入事件的触发器触发时间在插入之后DELIMITER//CREATETRIGGERemp_insertAFTERINSERTONempFOR EACH ROWBEGININSERTINTOemp_logVALUES(NULL,insert,NOW(),new.id,CONCAT(插入后(id:,new.id,,name,new.name,,age,new.age,salary,new.salary,)));END//DELIMITER;注意new和old关键字查看触发器SHOWTRIGGERS查看日志表为空现在对emp插入数据激活触发器INSERTINTOempVALUES(NULL,aa,20,3500),(NULL,bb,26,6000);再查看日志表update、delete同理不做演示。删除触发器DROPTRIGGERemp_insert如果把被监听的表删除触发器也会自动删除。