如何在sqlite manager

时间:2017-06-19 02:12:11

标签: sql sqlite

我正在以表格形式在sqlite上按字母顺序输入单词,并且它已被编号...假设我想在sylite管理器的两行之间添加一行,可能数字2是" aa"而数字3是" ac"如果我想添加" ab"在aa和ac之间,并使ab 3和4号,我怎么能轻易做到?

1 个答案:

答案 0 :(得分:1)

DBFiddle Demo of Update Statement

由于sqlite不支持Windows分析功能,实现这一点会有点棘手。您还可以使用类似的逻辑来创建before insert触发器。

假设:

  1. Number以任何整数开头,例如2,在这种情况下会增加1。因此,现有数据中没有丢失的序列。

  2. 字母数字排序适用于aa< aaa< ab< ac。这是由RDBMS根据字符串的每个字符的ascii值完成的,从第一个字符开始。

  3. 您插入的值ab没有任何id。运行以下更新语句后,id将分配给此val。通过使用类似的逻辑,您可以使用before insert触发器实现相同的效果。

  4. 首先查询以确定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。与上述情况一样,如果我们生成从id1的数字,则您的ID以n开头。所以这两个2diff,我将用它来添加所有生成的ID,以获得1。可能有一个更容易的方法,但这是我现在能想到的全部。

    现在我们在update语句中使用此查询来使用new_id更新id

    new_id