测试所用mysql版本:5.7.28
当我创建的mysql函数过程中,业务逻辑肯定存在sql时,执行函数写完了,
CREATE DEFINER = `root`@`1.14.30.49` FUNCTION `NewProc`() RETURNS int(11)
BEGIN
-- =============================================
-- Author: water
-- Create date: <20190310>
-- Description: 图片比对记录表关联查询数据迁移到总表
-- Modify [n]: < 20190310 >
-- =============================================
#函数执行内容
DECLARE executeTotal INTEGER(10); #执行条数
DECLARE oldTotal INTEGER(10); #执行前条数
DECLARE newTotal INTEGER(10); #执行后条数
SELECT COUNT(id) INTO executeTotal FROM picture_comparison WHERE create_time < data_before;
SELECT COUNT(id) INTO oldTotal FROM picture_comparison_sum;
#1、批量插入结果集
INSERT INTO picture_comparison_sum (id,student_name, student_id, tel, college_name, major_name, training_name, video_name, picture_type, registr_image_url, capture_image_url, comparison_result,confidence, create_time)
SELECT
p.id, s.studentName, s.studentId, s.tel, c.collegeName, m. NAME AS majorName, t.trainingName, v.videoName, p.type as picture_type, p.registr_image_url, p.capture_image_url, p.is_success as comparison_result, p.confidence, DATE_FORMAT( p.create_time, '%Y-%m-%d %H:%i:%s' ) AS create_time
FROM picture_comparison p LEFT JOIN student s ON p.user_id = s.studentId LEFT JOIN college_management c ON s.institute = c.id LEFT JOIN major m ON s.major = m.id LEFT JOIN training_class t ON s.clazz = t.id LEFT JOIN video v ON v.videoId = p.videoId
WHERE p.create_time < data_before ORDER BY p.create_time;
SELECT COUNT(id) INTO newTotal FROM picture_comparison_sum;
#2、批量删除表数据
IF executeTotal = newTotal - oldTotal THEN
DELETE FROM picture_comparison WHERE create_time < data_before;
END IF;
RETURN executeTotal;
END;
这时遇到了第一个错误:1418错误,mysql开启了bin-log, 我们就必须指定我们的函数是否是哪种类型(两种方法:【1、关闭bin-log;2、指定函数类型】)可以参考:MySQL 错误1418 的原因分析及解决方法
之后创建发现1419错误,(可能是当前用户没有创建函数的权限吧)可以参考:MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled ),
当然我这里采用了另一种解决方法,直接使用了root账户创建了函数,创建后root可以看到函数内容,普通用户看不到,原因是函数的定义者需要修改:可以参考:记一次mysql神奇现象--root可以看到函数内容,普通用户看不到?
最终结果:
CREATE DEFINER = `sjt_user1`@`%` FUNCTION `NewProc`()
RETURNS int(11)
DETERMINISTIC
BEGIN
-- =============================================
-- Author: water
-- Create date: <20190310>
-- Description: 图片比对记录表关联查询数据迁移到总表
-- Modify [n]: < 20190310 >
-- =============================================
#函数执行内容
DECLARE executeTotal INTEGER(10); #执行条数
DECLARE oldTotal INTEGER(10); #执行前条数
DECLARE newTotal INTEGER(10); #执行后条数
SELECT COUNT(id) INTO executeTotal FROM picture_comparison WHERE create_time < data_before;
SELECT COUNT(id) INTO oldTotal FROM picture_comparison_sum;
#1、批量插入结果集
INSERT INTO picture_comparison_sum (id,student_name, student_id, tel, college_name, major_name, training_name, video_name, picture_type, registr_image_url, capture_image_url, comparison_result,confidence, create_time)
SELECT
p.id, s.studentName, s.studentId, s.tel, c.collegeName, m. NAME AS majorName, t.trainingName, v.videoName, p.type as picture_type, p.registr_image_url, p.capture_image_url, p.is_success as comparison_result, p.confidence, DATE_FORMAT( p.create_time, '%Y-%m-%d %H:%i:%s' ) AS create_time
FROM picture_comparison p LEFT JOIN student s ON p.user_id = s.studentId LEFT JOIN college_management c ON s.institute = c.id LEFT JOIN major m ON s.major = m.id LEFT JOIN training_class t ON s.clazz = t.id LEFT JOIN video v ON v.videoId = p.videoId
WHERE p.create_time < data_before ORDER BY p.create_time;
SELECT COUNT(id) INTO newTotal FROM picture_comparison_sum;
#2、批量删除表数据
IF executeTotal = newTotal - oldTotal THEN
DELETE FROM picture_comparison WHERE create_time < data_before;
END IF;
RETURN executeTotal;
END;
编写时所引用和借鉴的url
MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled )