【问题标题】:Inserting new record in between the list of records在记录列表之间插入新记录
【发布时间】:2012-05-11 17:24:41
【问题描述】:

我想在表中已有的记录之间插入一条记录。有超过 40000 条记录,我想把这个新记录放在第 19 位。我该怎么做?

让我们考虑一个有 5 条记录的示例:

表格数据:

CREATE TABLE enum
  (identifier  VARCHAR2(64),
   code VARCHAR2(512),
   data VARCHAR2(4000))
/
INSERT ALL 
INTO enum VALUES ('HR_B_A', 'Halli, L6', 'Halli, L6')
INTO enum VALUES ('HR_B_A', 'Halli, L7', 'Halli, L7')
INTO enum VALUES ('HR_B_A', 'Halli, L8', 'Halli, L8')
INTO enum VALUES ('HR_B_A', 'Halli, L9', 'Halli, L9')
INTO enum VALUES ('HR_B_A', 'Halli, P6', 'Halli, P6')
INTO enum VALUES ('HR_B_A', 'Halli, P7', 'Halli, P7')
select * from dual
/

所以当我们检查表格时,我们得到:

SELECT * FROM enum

IDENTIFIER     CODE         DATA
----------   ---------    ---------
HR_B_A       Halli, L6    Halli, L6
HR_B_A       Halli, L7    Halli, L7
HR_B_A       Halli, L8    Halli, L8
HR_B_A       Halli, L9    Halli, L9
HR_B_A       Halli, P6    Halli, P6
HR_B_A       Halli, P7    Halli, P7

当我运行选择查询时我想要什么:

SELECT * from enum

IDENTIFIER     CODE         DATA
    ----------   ---------    ---------
    HR_B_A       Halli, L6    Halli, L6
    HR_B_A       Halli, L7    Halli, L7
    HR_B_A       Halli, L8    Halli, L8
    HR_B_A       Halli, L9    Halli, L9
    HR_B_A       Halli, L10   Halli, L10
    HR_B_A       Halli, P6    Halli, P6
    HR_B_A       Halli, P7    Halli, P7

我能想到的唯一方法是将数据传输到表中的 L9 行(例如 enum_temp),插入 L10 行,然后传输该表中的剩余数据。但我似乎无法弄清楚查询的语法。

提前致谢:-)

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    关系数据库中的行未排序

    除非在 SELECT 中使用 ORDER BY 表达式,否则无法确保任何所需的顺序。

    当您在值中混合多种类型的“信息”时,您将需要使用如下内容:

    select *
    from enum
    order by regexp_replace(code, '[0-9]', ''), 
             to_number(regexp_replace(code, '[^0-9]', ''))
    

    第一个 order by 表达式按代码中不包含数字的部分排序。这样所有Halli, L 值都被排序在一起。然后第二个 order by 表达式按代码的数值排序(去除所有非数字字符)。

    【讨论】:

      【解决方案2】:

      记录在表中的存储方式没有隐含的顺序。您可以在查询中使用排序以按所需顺序查看列表。

      您可以添加一个POSITION 列(NUMBER 类型),它指示记录在列表中的位置。然后,如果你想在列表的第 n 个位置插入一条记录:

      UPDATE enum SET position = position + 1 WHERE position >= <desired nth position> 
      INSERT INTO enum VALUES(<desired nth position>, ....)
      

      按顺序查看列表:

      SELECT * FROM enum ORDER BY position ASC
      

      编辑:并在 POSITION 列上添加索引(类型 b-tree 索引)以加快查询速度

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多