【问题标题】:Update a field to increment until another field changes更新一个字段以递增,直到另一个字段更改
【发布时间】:2018-10-04 10:59:37
【问题描述】:

这是我的第一个堆栈溢出问题,如果我做错了什么,敬请见谅。我避免在问题中使用“索引”一词,以免将我的问题与数据库索引混淆。这个问题是关于索引符号的 - 指定元素在一系列项目中的位置。


总结

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

paragraphs 表具有以下字段:

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

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

每个文档中的第一段应该有 index = 0。每个文档中的第二段应该有 index = 1。

段落表

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

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

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

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

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

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

非常感谢您的帮助! 多姆

【问题讨论】:

  • 哇,很好的问题 Dom - 我真的很想知道答案是什么。哦,欢迎来到 stackoverflow!

标签: mysql sql sql-update


【解决方案1】:

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

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

【讨论】:

  • ...主键是一个坏名字。
  • @Gordon 问题要求第一段为零 - 我不太明白这是如何完成的。我可能遗漏了一些东西,如果你能详细说明,那将不胜感激。
  • 谢谢你 - 这是完美的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2019-11-18
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多