我想运行一个范围为每个客户端的序列,以便他们每个都有从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列留作其他后端操作,联接,私有引用等。
答案 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中是可选的
还值得怀疑的是,序号本身是否绝对必要,以及您要使用它来完成什么