在mysql中创建不自动递增的序列方案

gv8xihay  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(420)

我要运行一个序列,作用域为每个客户机,以便它们都有一系列从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编号。我将自动递增列留给其他后端操作、联接、私有引用等。

hjzp0vay

hjzp0vay1#

你可以这样做作为一个声明

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

.. 但与两个单独的声明相比,我不完全确定它的性能。注意,groupby在mysql中实际上是可选的
同样值得质疑的是,序列号本身是否绝对必要,以及您试图用它来实现什么

相关问题