【问题标题】:Creating a sequence scheme in MYSQL without AUTO_INCREMENT在没有 AUTO INCREMENT 的 MYSQL 中创建序列模式
【发布时间】:2018-11-22 14:46:06
【问题描述】:

我想运行一个序列,范围为每个客户端,因此它们每个都有一系列从 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)

COALESCE 有什么用?

当记录在其系列中的第一个时,MAX() 将返回空,因此默认为 1。

为什么我需要一个用户范围的序列号?

这是一个文档捕获系统,显示大量表格数据,我有多个实体; System、Risk、Ticket、Process 和我正在使用带有标题的数字来帮助用户跟踪他们的记录。在表格中,初始结果将按此 ID 排序,因此我不想要全局 ID 编号。我将 auto_incremented 列留给其他后端操作、连接、私有引用等。

【问题讨论】:

  • 你的 MySQL 服务器版本是多少?你能访问窗口/分析函数吗?
  • @MadhurBhaiya 5.7 所以我不这么认为

标签: mysql sequence


【解决方案1】:

您可以将其作为一个语句来完成

   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 中实际上是可选的

同样值得质疑的是,序列号本身是否绝对必要,以及你想用它来完成什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2022-11-21
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多