【发布时间】:2019-06-13 23:11:04
【问题描述】:
如何优化此触发器?它工作得很好,但我认为它可以改进:
CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
IF ((SELECT id FROM request_missions ORDER BY id DESC LIMIT 1)+1) >= 1 AND
((SELECT id FROM request_missions ORDER BY id DESC LIMIT 1)+1) <= 9 THEN
SET New.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%y'), '-',
CONCAT('00000',(SELECT id FROM request_missions ORDER BY id DESC LIMIT 1)+1));
END IF
结果将在rm_number 列中,例如:
对于 id >=1 和 id
19-000001
19-000002
...
19-000009
【问题讨论】:
-
欢迎来到 StackOverflow!请注意,关于代码改进的问题——当代码运行时——更适合在CodeReview 上提问。
-
我不相信这会起作用 - id = 1 将获取 null 因为 before 触发器不可能知道 id 1 将被分配给第一个插入,因为它是在 before 触发器之后分配的。任何 id > 8 的东西都将获得 null。 2 到 8(含)之间的任何值都将分配一个与 id 匹配的数字(即 19-000002 到 19-000008)。 imo,唯一安全的方法是在插入之后使用单独的更新语句来执行此操作,这可能是事务的一部分。
-
谢谢 P.Salmon ,好的,我已经更新了上面的代码,我关心的是如何用另一个更短的表达式 (SELECT id FROM request_missions ORDER BY ID DESC LIMIT 1) +1) 替换例如一个变量。