【发布时间】:2020-05-10 09:38:01
【问题描述】:
我的表记录包含:id、year、month、number、value
创建记录时,number 设置为 NULL。
稍后当记录注册时,我需要为该记录创建唯一的 number,这对于特定的 year 和 month 组合是唯一的,并且应该从本月存在的最后一个 number 开始增加。同时其他人可能会尝试这样做,并且很可能会选择与我相同的递增数字。如果同时创建它们,我需要避免重复。
如果给定月份不存在数字,则应以 1 开头。
数字值可以在表格中重复,但不能用于相同的年/月组合。
我想这样做:
- 锁表
- 对现有值进行降序排序(对于给定的月/年)并获得第一个
- 增加它并更新特定记录
- 解锁表
但我想知道是否有更干净和优雅的方法来解决它?我想避免锁定表格太久,或者在应用端出现问题时冒着被锁定的风险。
问候。
按要求提供测试数据:
CREATE TABLE RECORDS (`id` int(11) NOT NULL AUTO_INCREMENT, `year` int(4), `month` int(4), `number` int(4), `value` int(4), PRIMARY KEY (`id`));
INSERT INTO RECORDS (year, month, number, value) VALUES
(2019, 10, 1, 100),
(2019, 10, 2, 200),
(2019, 10, 5, 300),
(2019, 10, 3, 400),
(2019, 10, 4, 500),
(2019, 10, 6, 600),
(2019, 10, NULL, 700),
(2019, 10, NULL, 800),
(2019, 10, NULL, 900),
(2019, 11, 1, 100),
(2019, 11, NULL, 200),
(2019, 11, NULL, 300),
(2019, 11, 2, 400),
(2019, 11, 3, 500),
(2019, 11, NULL, 600),
(2019, 11, 4, 700),
(2019, 12, 1, 100),
(2019, 12, 2, 300),
(2019, 12, NULL, 200),
(2019, 12, NULL, 500),
(2019, 12, NULL, 600),
(2019, 12, NULL, 700),
(2019, 12, NULL, 800);
小提琴: https://www.db-fiddle.com/f/d4Dfs5zcBUU1X95TaaHbNx/0#&togetherjs=93fntrtw0y
【问题讨论】:
-
为什么人们要为自己设置这些障碍?只需存储一个 id 并继续前进。
-
我不能无视我收到的要求。编号格式很严格...
-
哦,我希望你收费合理。 - 你的方法似乎和其他方法一样好。
-
MariaDB-10.3 有SEQUENCEs
-
但是我认为您将数据显示存储和检索的问题与数据显示的问题混淆了。