更新一个字段以递增,直到另一个字段更改

时间:2018-10-04 10:59:38

标签: mysql sql sql-update

这是我的第一个堆栈溢出问题,因此,如果我做错了什么,我深表歉意。我避免在问题中使用术语“索引”,以免将我的问题与数据库索引混淆。这个问题与索引符号有关-指定元素在一系列项目中的位置。


摘要

我有一个存储documents及其对应的paragraphs的系统;每个document包含许多paragraphs。这些数据存储在MySQL数据库中。

paragraphs表具有以下字段:

  • 主键(自动增加)
  • 文档ID(文档表的外键)

我希望向paragraphs表中添加一个新字段,该表设置为给定段落相对于其所在文档的索引。此查询仅在迁移添加该字段的过程中运行一次;然后我打算在插入段落时填充它。

每个文档中的第一段索引应为0。每个文档中第二段索引应为1。

段落表

  

主键:1   文件编号:1   索引:0

     

主键:2   文件编号:1   索引:1

     

主键:3   文件编号:1   索引:2

     

主键:4   文件编号:2   索引:0

     

主键:5   文件编号:2   索引:1

一种明显的方法是在每个文档的基础上执行此操作,但这似乎在大型文档数据库中效率不高。

非常感谢您的帮助! Dom

1 个答案:

答案 0 :(得分:4)

您可以使用变量来完成此操作(当然,在添加列之后):

alter table paragraphs add index int;

set @d := 0;
set @i := 0;

update paragraphs
    set index = (if(@d = document_id, @i := @i + 1,
                    if(@d := document_id, @i := 1, @i := 1)
                   )
                ) - 1  -- to start numbering at 0 rather than 1
    order by document_id, primary_key;

注意:index对于列来说确实是个坏名字,因为它是一个SQL关键字。将该列命名为其他名称,例如paragraph_number