【发布时间】:2020-05-19 04:32:23
【问题描述】:
我需要一个数据库设计 (mysql 8.0+) 来支持从 1 到特定最大数的循环数系列,例如 1 到 3,然后将得到 1,2,3,1,2,3,... 作为查询结果分别和循环。我的版本已经成功运行,但希望寻求更好的本地版本。非常感谢。
我的脚本在这里,
CREATE TABLE IF NOT EXISTS `cyclic_series_number` (
`category` VARCHAR(100) NOT NULL,
`sn` int NOT NULL,
`max` int NOT NULL,
PRIMARY KEY (`category`)
);
然后,插入 2 条记录。第一条记录将是要测试的记录。
REPLACE INTO `cyclic_series_number` (`category`, `sn`, `max`)
VALUES ('testing', 1, 3), ('ticket', 1, 999);
SELECT * FROM `cyclic_series_number`;
+--------------------------+
| cyclic_series_number |
+---+-----------+----+-----+
| # | category | sn | max |
+---+-----------+----+-----+
| 1 | 'testing' | 1 | 3 |
+---+-----------+----+-----+
| 2 | 'ticket' | 1 | 999 |
+---+-----------+----+-----+
最后,提供一个存储过程。
想法是更新 (sn=sn+1) 并获取该数字以及必要的检查 sn+1 以查看是否超过最大数字。
以上所有逻辑同时运行。
DROP PROCEDURE IF EXISTS `get_new_sn`;
DELIMITER //
CREATE PROCEDURE get_new_sn(IN input_category varchar(100))
BEGIN
SET @latest_sn = -1;
UPDATE `cyclic_series_number`
SET `sn` = (@latest_sn := case `sn` when `max` then 1 else `sn` + 1 end)
WHERE `category` = @input_category;
SELECT @latest_sn;
END //
DELIMITER ;
测试结果表明存储过程有效。
CALL get_new_sn('testing'); -- 2
CALL get_new_sn('testing'); -- 3
CALL get_new_sn('testing'); -- 1
CALL get_new_sn('testing'); -- 2
CALL get_new_sn('testing'); -- 3
CALL get_new_sn('testing'); -- 1
-- ...
参考文献
【问题讨论】:
-
是mysql还是SQL Server(微软的产品)?如果是后者,则有一流的序列对象可以本地执行您想要的操作(通过循环)。如果这就是你的工作,我会写下来。
-
@BenThul mysql 拜托,非常感谢~
-
我建议你简化问题;比如说,数字从 1 到 5。那就看meta.stackoverflow.com/questions/333952/…
-
@Strawberry 完全同意,所以实际上我已将其从 999,999 简化为 99。猜想已经很清楚了,不是吗?
-
没有。见上文。
标签: mysql