今天遇到一个业务需求是这样的:对在职员工超过55岁提醒。我想的思路是查询员工表,然后将超过55岁的人的信息存到另一个表,并且以消息的形式给用户提示,用户处理掉之后此消息失效(在数据库做标记)。
不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定导入字段。(当然可以混合查询多个表进行插入)
本文就将以MySQL数据库为例,介绍如何通过SQL命令行将某个表的所有数据或指定字段的数据,导入到目标表中。此方法对于SQLServer数据库,也就是T-SQL来说,同样适用 。
类别一、 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法:
INSERT INTO目标表SELECT * FROM来源表 ;
例如,要将 articles 表插入到 newArticles 表中,则可以通过如下SQL语句实现:
INSERT INTOnewArticlesSELECT * FROMarticles ;
类别二、 如果只希望导入指定字段,可以用这种方法:
INSERT INTO目标表 (字段1, 字段2, ...)SELECT字段1, 字段2, ...FROM来源表 ;
请注意以上两表的字段必须一致,否则会出现数据转换错误。
===========================================================================================
INSERT INTO TPersonnelChange( UserId, DepId, SubDepId, PostionType, AuthorityId, ChangeDateS, InsertDate, UpdateDate, SakuseiSyaId )SELECT UserId, DepId, SubDepId, PostionType, AuthorityId, DATE_FORMAT(EmployDate, '%Y%m%d'), NOW(), NOW(), 1 FROM TUserMst WHERE `Status` = 0 AND QuitFlg = 0 AND UserId < 2
---------------------自己的业务实现----------------------------
1.插入语句:
年龄大于55的插入,且只插入一条数据,
INSERT INTO message (messageid, NAME, idCode, sex, birthday, headaddress, isDispose) SELECT DISTINCT emp.employeeId, emp.name, emp.idCode, emp.sex, emp.birthday, emp.headaddress, '0' FROM employee_out emp, haulemployeeout haulemp, haulinfo haul WHERE emp.idCode = haulemp.empoutIdcard AND haulemp.bigid = haul.bigid AND haul.bigstatus = '进行中' AND emp.employeeId NOT IN(SELECT messageid FROM message) AND TIMESTAMPDIFF(YEAR,emp.birthday,NOW()) > 54
2.在此基础上写的存储过程:
DELIMITER $$ CREATE PROCEDURE `queryOlderPerson`() BEGIN /*将外部55岁以上插入消息表*/ INSERT INTO message (messageid, NAME, idCode, sex, birthday, empType, isDispose) SELECT DISTINCT emp.employeeId, emp.name, emp.idCode, emp.sex, emp.birthday, '0', '0' FROM employee_out emp, haulemployeeout haulemp, haulinfo haul WHERE emp.idCode = haulemp.empoutIdcard AND haulemp.bigid = haul.bigid AND haul.bigstatus = '进行中' AND emp.employeeId NOT IN(SELECT messageid FROM message) AND TIMESTAMPDIFF(YEAR,emp.birthday,NOW()) > 54; /*将内部55岁以上插入消息表*/ INSERT INTO message (messageid, NAME, idCode, sex, birthday, empType, isDispose) SELECT DISTINCT emp.employeeId, emp.name, emp.idCode, emp.sex, emp.birthday, '1', '0' FROM employee_in emp WHERE emp.employeeId NOT IN(SELECT messageid FROM message) AND TIMESTAMPDIFF(YEAR,emp.birthday,NOW()) > 54; END $$ DELIMITER ;
3.mysql事件调用上面存储过程:(每分钟执行一次上面存储过程)
CREATE event queryOlderPer ON SCHEDULE EVERY 1 MINUTE STARTS NOW() DO CALL queryOlderPerson()