创建视图与触发器

狂风中的少年 提交于 2020-03-11 20:11:45
 CREATE VIEW test.v AS SELECT * FROM t;

  表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。 

  视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,

可使用可选的column_list子句,列出由逗号隔开的ID。column_list中的名称数目必须等于SELECT语句检索的列数。

SELECT * FROM v;

  视图定义服从下述限制:
  · SELECT语句不能包含FROM子句中的子查询。
  · SELECT语句不能引用系统或用户变量。
  · SELECT语句不能引用预处理语句参数。
  · 在存储子程序内,定义不能引用子程序参数或局部变量。
  · 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
  · 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。
  · 在视图定义中命名的表必须已存在。
  · 不能将触发程序与视图关联在一起。
  在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。
  对于定义中的其他选项或子句,它们将被增加到引用视图的语句的选项或子句中,但效果未定义。例如,如果在视图定义中包含LIMIT子句,而且从特定视图进行了选择,而该视图使用了具有自己LIMIT子句的语句,那么对使用哪个LIMIT未作定义。相同的原理也适用于其他选项,如跟在SELECT关键字后的ALL、DISTINCT或SQL_SMALL_RESULT,并适用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。
  如果创建了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的结果

用  DESCRIBE  语句查看视图的基本信息

语法如下:

    DESCRIBE   视图名;

【注】  DESCRIBE  可以简写为  DESC  

用  SHOW  TABLE  STATUS   语句查看视图的基本信息

语法如下:

    SHOW   TABLE  STATUS   LIKE  ‘视图名’;

用  SHOW  CREATE  VIEW  语句查看视图的详细信息

语法如下:

    SHOW   CREATE   VIEW  视图名;

 

 

 

 

触发器

CREATE <触发器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row<触发器主体>

  

INSERT | UPDATE | DELETE |BEFORE | AFTER

  • INSERT:将新行插入表时激活触发器。例如,INSERT 的 BEFORE 触发器不仅能被 MySQL 的 INSERT 语句激活,也能被 LOAD DATA 语句激活。
  • DELETE: 从表中删除某一行数据时激活触发器,例如 DELETE 和 REPLACE 语句。
  • UPDATE:更改表中某一行数据时激活触发器,例如 UPDATE 语句。
  • BEFORE 和 AFTER,触发器被触发的时刻,表示触发器是在激活它的语句之前或之后触发。若希望验证新数据是否满足条件,则使用 BEFORE 选项;若希望在激活触发器的语句执行之后完成几个或更多的改变,则通常使用 AFTER 选项。

查看数据库中已有的触发器,则可以使用 SHOW TRIGGERS 语句

 

 

创建一个名为 SumOfSalary 的触发器,触发的条件是向数据表 tb_emp8 中插入数据之前,对新插入的 salary 字段值进行求和计算。输入的 SQL 语句和执行过程如下所示

CREATE TRIGGER SumOfSalary
    BEFORE INSERT ON tb_emp8
    FOR EACH ROW
    SET @sum=@sum+NEW.salary;

  

创建一个名为 double_salary 的触发器,触发的条件是向数据表 tb_emp6 中插入数据之后,再向数据表 tb_emp7 中插入相同的数据,并且 salary 为 tb_emp6 中新插入的 salary 字段值的 2 倍。输入的 SQL 语句和执行过程如下所示。

 CREATE TRIGGER double_salary
     AFTER INSERT ON tb_emp6
     FOR EACH ROW
     INSERT INTO tb_emp7
     VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!