来源:网易云课堂《精通MySQL存储过程、函数和触发器》课程
讲师:huangxifeng607(黄锡峰)
笔记:
(1)函数的只读高级特性
delimiter $$
create function testa() returns int
reads sql data
begin
declare my_uid int;
select uid into my_uid from hxf where salary<3000 limit 1;
return my_uid;
end;
$$
delimiter;
1.提供子程序使用数据的内在信息
reads sql data只包含读的sql语句,说明只有读,没有更新,对复制精确性是安全的,则可以放行
(2)函数包含可更新语句的高级特性
delimiter $$
create function testa()
contains sql -> reads sql data
begin
update user set level=5 where uid=5;
return 5;
end;
$$
delimiter;
如果函数包含了更新语句,指定为contains sql, modifies sql data等写的高级特性是不允许创建的。
包含更新语句的函数可以指定为no sql, 或者reads sql data只读特性,才可以放行创建,复制可以正常进行
(3)函数包含可更新语句对复制的影响
delimiter $$
create function testa() returns int
modifies sql data
begin
update user set level=50 where uid=5;
return 5;
end;
$$
delimiter;
如果函数包含了更新语句,指定为contains sql, modifies sql data, 并且允许创建,有两个方案:
修改log_bin_trust_function_creators=1(从库也要修改),
或者关闭binlog日志
对复制的影响:这种更新记录二进制日志,也能正常复制
(4)函数的高级特性特点
1.提供了函数使用数据的内在信息:
contains sql 包含读写语句
no sql 无sql语句(只读)
reads sql data 只读的sql语句
modifies sql data 只写的sql语句
2.函数涉及原则上不允许更新,历史上函数更新对复制可能是不安全的。
二进制不回记录select语句,但只有函数中有更新语句时是例外的
3.如果包含了更新语句,指定为contains sql, modifies sql data是不允许创建的。
但可以指定为no sql, 或者reads sql data只读特性,才可以放行创建,复制可以正常进行
4.如果函数包含了更新语句,指定为contains sql, modifies sql data写的高级特性,并且允许创建,有两个方案:
修改log_bin_trust_function_creators=1(从库也要修改),
或者关闭binlog日志。但对数据复制可能是不安全的