mysql函数、事务、视图、触发器

一、 函数

CREATE FUNCTION f_name(paramters) returns dataType; return value; 

paramters 只能是in 输入参数 参数名 类型
必须有返回值
不能加begin 和end
returns 后面是返回值的类型 这里不加分号
return 后面是要返回的值
示例:将两数相加

create function addfuntion(a int,b int) 
returns int return a + b; 
#执行函数 
select addfuntion(1,1); 

注意:
函数只能返回一个值
函数一般不涉及数据的增删改查 就是一个通用的功能
调用自定义的函数 与调用系统的一致 不需要call 使用select 可获得返回值
函数中不能使用sql语句
就像在java中不能识别sql语句一样
如:count()、sum()、avg()、max()、min()

二、事务

​ 事务是一组不可分割的单位,要么同时成功,要么同时不成功
​ 事物前后的数据完整性应该保持一致
​ 多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认

在python中示例:

import pymysql

try:
conn = pymysql.connect(host="ip",user="user",password="password",db="test1")
print("连接服务器成功!")

cursor = conn.cursor()
sql = "update student set name = \"jack2\" where s_id = 2 ;"
sql2 = "update student set name = rose21 where s_id = 3;" # money打错了将导致执行失败
try:
cursor.execute(sql)
cursor.execute(sql2)
conn.commit()
print("执行成功 提交")
except:
print("发送错误 回滚..")
conn.rollback()

except Exception as e:
print("连接服务器失败.....")
print(type(e),e)
finally:
if cursor:cursor.close()
if conn:conn.close()

三、视图

视图可以用来进行数据权限控制,或者是简化连接查询,对视图进行增删改会同步到原表中,但是由于视图一般都是部分字段 所以一般都会失败
视图是一张虚拟表 所以使用方式与普通表没有任何区别

创建视图 用于控制数据字段权限 或者 简化多表的查询语句

CREATE VIEW car_location (车架号,layer,地区) as 
SELECT 
vehicle_purchase_invoice.frame_num,vehicle_purchase_invoice.layer,sys_location.name
from vehicle_purchase_invoice,sys_location
WHERE vehicle_purchase_invoice.layer = sys_location.layer;
#查看视图 
SELECT * from car_location WHERE 车架号 ='20B0062R9Y2548197';
#删除视图
DROP VIEW car_location;

四、触发器

1、准备数据

CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);

2、错误日志表

CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);

3、创建触发器

delimiter //
create trigger trigger1 after insert on cmd for each row
FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次。
begin
if new.success = "no" then
insert into errlog values(null,new.cmd,new.sub_time);
end if;
end//
delimiter ;

DROP trigger trigger1;

4、往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志

INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('egon','0755','ls -l /etc',NOW(),'yes'),
('egon','0755','cat /etc/passwd',NOW(),'no'),
('egon','0755','useradd xxx',NOW(),'no'),
('egon','0755','ps aux',NOW(),'yes');

5、查看错误日志表中的记录是否有自动插入

select *from errlog;

猜你喜欢

转载自blog.csdn.net/Krystal_RonghuiLi/article/details/108000089
今日推荐