我正在以表格形式在sqlite上按字母顺序输入单词,并且它已被编号...假设我想在sylite管理器的两行之间添加一行,可能数字2是" aa"而数字3是" ac"如果我想添加" ab"在aa和ac之间,并使ab 3和4号,我怎么能轻易做到?
答案 0 :(得分:1)
的 DBFiddle Demo of Update Statement
强>
由于sqlite不支持Windows分析功能,实现这一点会有点棘手。您还可以使用类似的逻辑来创建before insert
触发器。
假设:
Number以任何整数开头,例如2
,在这种情况下会增加1
。因此,现有数据中没有丢失的序列。
字母数字排序适用于aa
< aaa
< ab
< ac
。这是由RDBMS根据字符串的每个字符的ascii值完成的,从第一个字符开始。
您插入的值ab
没有任何id
。运行以下更新语句后,id
将分配给此val
。通过使用类似的逻辑,您可以使用before insert
触发器实现相同的效果。
首先查询以确定new_id
。
select t.*,
(select count(*) from test t1 where t.val>=t1.val) +
o.diff as new_id
from test t
cross join
(select * from
(select t.*,(select count(*) from test t1 where t.val>=t1.val) as rn ,
id - (select count(*) from test t1 where t.val>=t1.val) as diff
from test t
) where rn=1
) o
输出
+------+-----+--------+
| id | val | new_id |
+------+-----+--------+
| 2 | aa | 2 |
| 3 | ac | 4 |
| null | ab | 3 |
+------+-----+--------+
我首先使用cross join
,我们必须确定具有实际difference
的{{1}} min_id
。与上述情况一样,如果我们生成从id
到1
的数字,则您的ID以n
开头。所以这两个2
是diff
,我将用它来添加所有生成的ID,以获得1
。可能有一个更容易的方法,但这是我现在能想到的全部。
现在我们在update语句中使用此查询来使用new_id
更新id
。
new_id