【发布时间】:2016-07-18 14:44:42
【问题描述】:
我想设置一个 MySQL 触发器来设置一个具有以下格式的 ID 号:
一年中的第几周 + 001
例如,09002 将是一年中的第 9 周,002 将是该周的第二个订单。
任何帮助,评论将不胜感激,谢谢。
【问题讨论】:
我想设置一个 MySQL 触发器来设置一个具有以下格式的 ID 号:
一年中的第几周 + 001
例如,09002 将是一年中的第 9 周,002 将是该周的第二个订单。
任何帮助,评论将不胜感激,谢谢。
【问题讨论】:
将 CONCAT 与 MYSQL 日期函数周一起使用
select CONCAT('0',WEEK(now()),'002');
+-------------------------------+
| CONCAT('0',WEEK(now()),'002') |
+-------------------------------+
| 029002 |
+-------------------------------+
1 row in set (0.05 sec)
DROP TRIGGER IF EXISTS TEST_INSERT;
DELIMITER $$
CREATE TRIGGER TEST_INSERT AFTER INSERT ON TEST FOR EACH ROW BEGIN
NEW.ID= CONCAT('0',WEEK(now()),'002')
-------------------- your insert statement ----------
END$$
【讨论】:
在 MySQL 中使用触发器执行此操作是一个问题,因为 MySQL 没有 SEQUENCE 对象,就像其他一些 SQL 数据库一样。您不能在触发器中生成递增的 id 值,必须生成它以填充具有 AUTO_INCREMENT 选项的整数列。
所以这是一个非常规的解决方案:不要考虑为此使用触发器,使用主键。在每周开始时,运行计划的作业以推进下一个自增数字。
ALTER TABLE mytable AUTO_INCREMENT = WEEK(NOW())*1000;
您可以通过 cron 作业执行此操作,也可以使用 MySQL Event Scheduler。
我还要评论说,您不能依赖递增的 id 是连续的。您可能有失败的插入,或者您可能有一些插入是回滚事务的一部分,或者您可能有以后的删除。所有这些都会消除具有特定 id 值的行,并且您不应该重复使用 id 值。
【讨论】: