MYSQL中的function和trigger使用实践

FUNCTION就是创建一个函数,里面写上自己的逻辑,然后返回处理的结果

我们创建一个雇员表employees

create table employees  
(  
    employee_id int(11) primary key not null auto_increment,  
    employee_name varchar(50) not null,  
    employee_sex varchar(10) default '男',  
    hire_date datetime not null default current_timestamp,  
    employee_mgr int(11),  
    employee_salary float default 3000,  
    department_id int(11)  
);  

insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('David Tian','1',10,7500,1);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Black Xie','1',10,6600,1);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Moses Wang','1',10,4300,1);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Rena Ruan','0',10,5300,1);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Sunshine Ma','0',10,6500,2);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Scott Gao','1',10,9500,2);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Warren Si','1',10,7800,2);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Kaishen Yang','1',10,9500,3);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Simon Song','1',10,5500,3);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Brown Guan','1',10,5000,3);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Eleven Chen','0',10,3500,2);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Cherry Zhou','0',10,5500,4);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Klause He','1',10,4500,5);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Maven Ma','1',10,4500,6);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Stephani Wang','0',10,5500,7);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Jerry Guo','1',10,8500,1);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Gerardo Garza','1',10,25000,8);  
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Derek Wu','1',10,5500,5);  
  
  
select * from employees;  

写一个根据id查询雇员工资的函数

CREATE FUNCTION getInfoById (id INT) RETURNS VARCHAR (300)
BEGIN
	RETURN (
		SELECT
			CONCAT(
				'employee name:',
				employee_name,
				'---',
				'salary: ',
				employee_salary
			)
		FROM
			employees
		WHERE
			employee_id = id
	);


END

在NavicatForMySQL里面执行下

可以看到我们在mysql里面已经创建好了一个函数,在NavicatForMySQL也可以看到

然后调用下,试试效果

trigger 就是触发器,联想一下网页界面的按钮监听事件

一个道理,但是触发器不能经常用,因为每次操作一行数据都会触发这个监听事件,确实挺浪费的。

下面是语法

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表
END

 根据以上的表格,可以使用一下格式来使用相应的数据:

NEW.columnname:新增行的某列数据
OLD.columnname:删除行的某列数据

我们针对于上面的雇员表创建一个插入的触发器,每次插入都会在操作日志里面插入当前雇员的名字和操作时间

操作日志表oplogs的表结构如下:

create trigger insert_trigger AFTER INSERT ON employees FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;
SET s2 = ' is created';
SET s1 = CONCAT(NEW.employee_name,s2);
INSERT into oplogs(optype,time) VALUES(s1,NOW());
END

然后我们插入一条数据

insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('meinv','0',10,2300,1);  

然后我们去操作日志看下,触发器已经自动触发,并在操作日志表插入了一条新的数据

猜你喜欢

转载自blog.csdn.net/q957967519/article/details/81778786