时间:2023-03-11来源:系统城装机大师作者:佚名
假设students表中包含id和name两个字段,创建一个函数,函数的作用是根据id查找name
1 2 |
create table students(id int , name varchar (100)); insert into students(id, name ) values (1, 'annie' ),(2, 'bell' ),(3, 'danny' ); |
1 2 3 4 5 6 7 8 9 |
DELIMITER // create function find_student(id int ) returns varchar (100) READS SQL DATA begin declare sname varchar (100) default '' ; select students. name into sname from students where students.id=id; return sname; end // DELIMITER ; |
需要注意的事项:
1)使用DELIMITER//修改分隔符
mysql的默认语句结束符号是分号,当mysql遇到分号时就自动执行当前语句。因为函数定义时包含多条sql语句,所以使用DELIMITER //先将分隔符设置为//,等函数创建语句完成后,再将分隔符改回分号即可。
2)READS SQL DATA
之前我没写这句话,但是创建时mysql报错,提示Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
上网查了一下,意思是没有声明mysql函数的类型:
mysql开启了bin-log, 我们就必须指定我们的函数是否是哪种类型:
3)使用局部变量
变量定义:我这里使用declare sname varchar(100) default ‘’;定义了局部变量sname,
变量使用:
可以使用select students.name into sname from students where students.id=id;为变量赋值
也可以直接使用set语句来赋值,如set sname=‘test’
1 | select find_student(3); |
目前在项目中,执行创建mysql的函数出错,
mysql 创建函数出错信息如下:
Caused by: java.sql.SQLException: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2373)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
... 35 more
这是因为有一个安全参数没有开启,log_bin_trust_function_creators 默认为0,是不允许function的同步的,开启这个参数,就可以创建成功了。
查看是否开启:
1 2 3 4 5 6 7 |
show variables like '%func%' ; + ---------------------------------+-------+ | Variable_name | Value | + ---------------------------------+-------+ | log_bin_trust_function_creators | ON | + ---------------------------------+-------+ 1 row in set (0.00 sec) |
为on则是开启了
1 | set global log_bin_trust_function_creators = 1; |
可以通过这个命令设置,但是MySQL重启后就失效了。
所有最后是通过修改MySQL数据库的配置文件
在配置文件/etc/my.cnf的[mysqld]配置log_bin_trust_function_creators=1
修改完后重启MySQL。
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30