这是我的第一个堆栈溢出问题,因此,如果我做错了什么,我深表歉意。我避免在问题中使用术语“索引”,以免将我的问题与数据库索引混淆。这个问题与索引符号有关-指定元素在一系列项目中的位置。
我有一个存储documents
及其对应的paragraphs
的系统;每个document
包含许多paragraphs
。这些数据存储在MySQL数据库中。
paragraphs
表具有以下字段:
我希望向paragraphs
表中添加一个新字段,该表设置为给定段落相对于其所在文档的索引。此查询仅在迁移添加该字段的过程中运行一次;然后我打算在插入段落时填充它。
每个文档中的第一段索引应为0。每个文档中第二段索引应为1。
主键:1 文件编号:1 索引:0
主键:2 文件编号:1 索引:1
主键:3 文件编号:1 索引:2
主键:4 文件编号:2 索引:0
主键:5 文件编号:2 索引:1
一种明显的方法是在每个文档的基础上执行此操作,但这似乎在大型文档数据库中效率不高。
非常感谢您的帮助! Dom
答案 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
。