首页 > 数据库 >MySQL event事件,定时按年份动态创建表

MySQL event事件,定时按年份动态创建表

时间:2023-01-04 17:33:37浏览次数:52  
标签:ci SET DEFAULT utf8 动态创建 COLLATE MySQL NULL event

参考资料:

1、MySQL事件(定时任务):https://blog.51cto.com/u_15549234/5138457;
2、mysql创建存储过程语法(MySQL创建存储过程sql语句):https://www.gaojipro.com/a/108616;
3、mysql计划任务每天定时执行:https://www.likecs.com/show-305863378.html;
4、MySQL存储过程使用动态表名:https://blog.51cto.com/u_15127617/4279455

思路

MySQL event事件可以通过定时任务执行指定的存储过程。需求是系统需要在新年到来之前创建新年的年份表,为了省去人工操作,计划使用数据库event事件实现该功能。
第一步:利用MySQL event事件创建一个定时任务;
第二步:写一个可以简化人工操作的存储过程(调试时可以写个简单的存储过程,可以看到定时任务生效即可;后续再根据实际业务调整存储过程需要执行的脚本内容);
第三步:让event事件定时调用存储过程。

简单的存储过程

# 删除存储过程
DROP PROCEDURE IF EXISTS doSth;
# 创建存储过程
CREATE PROCEDURE doSth () BEGIN
    UPDATE test SET date = NOW();
END;

实现

# 删除存储过程
DROP PROCEDURE IF EXISTS create_tables;
# 创建存储过程
CREATE PROCEDURE create_tables () BEGIN
    SET @nianfen = YEAR(DATE_ADD(NOW(),INTERVAL 1 YEAR));
        
    # 入库单明细表
    SET @create_sql = CONCAT("CREATE TABLE xhp_t_in_stock_order_detail_",@nianfen,"(
        `id` int(11) NOT NULL COMMENT 'ID',
        `companyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `instkbillno` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `materialno` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `materialname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `unit` int(11) NULL DEFAULT NULL,
        `unitname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `specifications` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `manufactor` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `model` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `kuwei` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
        `num` double NULL DEFAULT NULL,
        `unitprice` double NULL DEFAULT NULL,
        `money` double NULL DEFAULT NULL,
        `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `podetailid` int(11) NULL DEFAULT NULL,
        `size` double NULL DEFAULT NULL,
        `isfree` tinyint(2) NULL DEFAULT NULL,
        `createtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `field1` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field2` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field3` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field4` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field5` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;");
    PREPARE create_stmt FROM @create_sql;
    EXECUTE create_stmt;
    DEALLOCATE PREPARE create_stmt;
        
    # 入库单主表
    SET @create_sql = CONCAT("CREATE TABLE xhp_t_in_stock_order_main_",@nianfen,"(
        `id` int(11) NOT NULL COMMENT 'ID',
        `billdate` date NULL DEFAULT NULL,
        `billno` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `businesstype` tinyint(2) NULL DEFAULT NULL COMMENT 'ҵ',
        `warehouse` int(11) NULL DEFAULT NULL,
        `storageman` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `totalnum` double NULL DEFAULT NULL,
        `totalmoney` double NULL DEFAULT NULL,
        `creator` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `checker` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `createtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `checktime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `state` tinyint(2) NULL DEFAULT NULL COMMENT '״̬',
        `companyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `iswriteoff` tinyint(2) NULL DEFAULT NULL,
        `writeoffbillno` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `createtype` tinyint(2) NULL DEFAULT NULL,
        `datasource` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ϵͳ',
        `taxrate` double NULL DEFAULT NULL,
        `currency` int(11) NULL DEFAULT NULL,
        `field1` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field2` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field3` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field4` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `field5` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE,
        UNIQUE INDEX `instockorderindex`(`billno`) USING BTREE,
        INDEX `index_companyid`(`companyid`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;");
    PREPARE create_stmt FROM @create_sql;
    EXECUTE create_stmt;
    DEALLOCATE PREPARE create_stmt;
    
END;
# 查看数据库所有存储过程
SHOW PROCEDURE STATUS WHERE db = 'jc_x1web';

# 执行存储过程
# CALL create_tables;

-- 开启 ON/关闭 OFF 事件调度器
SET GLOBAL event_scheduler = ON;

-- 查看事件调度器状态
SHOW VARIABLES LIKE 'event_scheduler';

#删除事件
DROP EVENT IF EXISTS init_tables;

-- 创建名为 init_tables 的事件,注意此处没有括号
CREATE EVENT init_tables
-- 创建周期定时的规则,每多长时间执行一次
#ON SCHEDULE EVERY 1 MINUTE STARTS CONCAT(YEAR(NOW()),'-01-03',' 16:43:00')
ON SCHEDULE EVERY 1 YEAR STARTS CONCAT(YEAR(DATE_ADD(NOW(),INTERVAL 0 YEAR)),'-12-30',' 23:59:59')
-- 创建后并不开始生效,后续手动生效
ON COMPLETION PRESERVE DISABLE
-- do call create_tables() 是该事件的操作内容,表示调用名为 create_tables() 的存储过程。
DO CALL create_tables();

#开启 ENABLE/关闭 DISABLE 事件
ALTER EVENT init_tables ON COMPLETION PRESERVE ENABLE;

#查看事件
SELECT event_schema 数据库,event_name,event_definition,interval_value,interval_field,status 存储过程是否可用,STARTS 事件生效开始时间 FROM information_schema.EVENTS;

 

标签:ci,SET,DEFAULT,utf8,动态创建,COLLATE,MySQL,NULL,event
From: https://www.cnblogs.com/huakaiyoushi/p/17025440.html

相关文章

  • Event Socket 相关命令
    一、首先使用工具netcat与FreeSWITCH进行内连(参考18.2.2)    输入如下命令接收事件:                                event......
  • FreeSWITCH学习笔记18 - Event Socket
    目录:   18.1、架构18.1.1、外连模式 18.1.2、内连模式 18.2、EventSocket协议18.2.1、外连                       ......
  • mysql性能分析之隐式类型转化
    之前遇到过一个问题,建表时将字段status的类型设置为varchar,插入数据时,该字段的值只有0和1两种情况,在该字段上建立索引,使用wherestatus=1查询时却并没有走索引。如下所示:1......
  • MySQL------单行函数汇总
    基本函数函数用法举例ABS(x)返回x的绝对值ABS(-2)=2;ABS(13)=13SIGN(X)返回X的符号。正数返回1,负数返回-1,0返回0SIGN(-265)=-1;SIGN(123)=1PI()......
  • mysql show processlist的使用
    showfullprocesslist用来查看当前线程处理情况,具体信息请参考官网:https://dev.mysql.com/doc/refman/5.7/en/show-processlist.htmlshowfullprocesslist返回的结果......
  • Mysql错误问题记录
    ①Incorrectstringvalue:'\xE6\x94\xBE\xE5\xA4\xA7...'forcolumn'name'atrow1Query……原因:编码不匹配。数据库是latin1编码,而插入的中文字符串是utf-8编码。......
  • ODBC连接mysql
    配置/etc/odbc.ini执行命令:isqlfreeswitchfreeswitch123456-v第一个报错:[08S01][unixODBC][MySQL][ODBC5.3(w)Driver]Can'tconnecttolocalMySQLserverthrou......
  • 关于新服务器安装Mysql服务后注意事项:1.表名区分大小写 2.日期中不允许出现值为0
    新购入一台Linux服务器,将项目部署至服务器,项目出现问题记录如下:1.项目使用JPA,实例类中表名为大写,JPA查询显示该表不存在,原因是Mysql设置中默认表名区分大小写showvari......
  • MySQL删除有外键关联的表
    MySQL删除有外键关联的表现象:Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails原因:在删除表时,删除的表与另外一张表存在外键关联解决:方案一......
  • MySQL 删除时 Data truncation Truncated incorrect DOUBLE value
    MySQL删除时Datatruncation:TruncatedincorrectDOUBLEvalue数据库在删除的时候会做数据类型校验,将字段值转换为你传进去的类型,发现不能转换的就会报错......