在不使用AUTO_INCREMENT的MYSQL中创建序列方案

时间:2018-11-22 14:46:06

标签: mysql sequence

我想运行一个范围为每个客户端的序列,以便他们每个都有从1开始的一系列ID。

Clients:
+----+-------+
| id | name  |
+----+-------+
|  1 | Dave  |
|  2 | Sarah |
+----+-------+

Tickets:
+----+-----------+----------+----------------------------+
| id | clientID  | sequence |  title                     |
+----+-----------+----------+----------------------------+
|  1 |         1 |        1 | Title 1                    |
|  2 |         1 |        2 | Another title for Client 1 |
|  3 |         2 |        1 | Different Title            |
+----+-----------+----------+----------------------------+

做到这一点的最佳方法是什么(就速度和数据完整性而言)?插入时我有类似的东西:

为戴夫添加新票

SELECT COALESCE( (MAX(sequence) + 1), 1) as nextSeq WHERE id = 1 FROM tickets

然后

INSERT INTO tickets (... sequence) VALUES (... nextSeq)

什么是凉粉?

当该记录成为该系列中的第一条记录时,MAX()将返回空值,因此默认为1。

为什么要使用用户范围的序列号?

这是一个文档捕获系统,显示大量表格数据,我有多个实体;系统,风险,故障单,流程,我正在使用带有标题的数字来帮助用户跟踪其记录。在表中,初始结果将以此ID排序,因此我不希望对全局ID进行编号。我将auto_incremented列留作其他后端操作,联接,私有引用等。

1 个答案:

答案 0 :(得分:2)

您可以将其作为一项声明

   INSERT 
     INTO ticket (clientID, sequence, title)
   SELECT clientID,
          MAX(sequence) + 1,
          "Dave's New Ticket"
     FROM ticket
    WHERE clientID = 1 /** Dave */
 GROUP BY clientID

..但是与两个单独的语句相比,我不确定性能。注意,GROUP BY实际上在MySQL中是可选的

还值得怀疑的是,序号本身是否绝对必要,以及您要使用它来完成什么