MySQL插入时拼接Job名与时间戳:触发器选型及创建方法
应该用BEFORE INSERT触发器,附创建步骤
很明确,你得选BEFORE INSERT触发器——原因很直白:你需要在数据真正写入transfer_job表之前,修改要插入的job_name值。AFTER INSERT触发器是在数据已经成功插入后才触发的,这时候再想改原始插入的字段值就晚了,完全满足不了你的需求。
下面是创建这个触发器的具体SQL代码:
DELIMITER // CREATE TRIGGER modify_transfer_job_name_before_insert BEFORE INSERT ON transfer_job FOR EACH ROW BEGIN -- 拼接原始job_name与当前日期(YYYYMMDD格式) SET NEW.job_name = CONCAT(NEW.job_name, '_', DATE_FORMAT(CURDATE(), '%Y%m%d')); END // DELIMITER ;
代码细节说明:
DELIMITER //:临时修改SQL语句的结束符,因为触发器体内部有分号,避免MySQL提前终止解析。modify_transfer_job_name_before_insert:触发器的自定义名称,你可以根据自己的习惯调整,只要做到见名知意即可。BEFORE INSERT ON transfer_job:指定触发时机为插入操作之前,作用目标是transfer_job表。FOR EACH ROW:表示每插入一行数据,就执行一次触发器内的逻辑。SET NEW.job_name = ...:NEW代表即将插入的那条记录,通过这个语句修改它的job_name字段。DATE_FORMAT(CURDATE(), '%Y%m%d')会生成类似20240520的日期字符串;如果需要包含精确到时分秒的时间戳,可以改成DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'),生成20240520143510这类格式。
测试验证:
当你执行原本的插入语句:
insert into transfer_job (job_name, status) values ('Drift', 'Pending');
此时transfer_job表中插入的job_name会自动变成Drift_20240520(日期替换为当前系统日期),完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Mohammed Mohideen M Z




