【问题标题】:Inserting a row in between two rows in a table在表格的两行之间插入一行
【发布时间】:2014-09-03 17:39:55
【问题描述】:

我有一个包含两列 subj-id,subj-name 的表格,格式如下。

101 Maths
102 Science
103 Biology
201 Maths
202 Science
203 Biology
204 Geography
301 Maths
302 Science

现在我需要在数学和科学之间的所有位置插入一行物理,表格应如下所示

101 maths
102 Physics
103 Biology
201 Maths
202 Physics
203 Science
204 Biology
205 Geography
301 Maths
302 Physics
303 Science

我有这个问题很久了。我在这里只提到了三个插入。在实际问题中,我需要在 50 多个地方在数学和科学之间进行此类插入。手动操作非常困难。 谁能指导我处理这种情况需要遵循的方法。

【问题讨论】:

  • 为什么需要重做 id?
  • 是否提供了此行数据或列?是postgresql还是mysql?你们都标记了
  • 没有理由需要在数据库中执行此操作。使用数据库的美妙之处在于,您可以随心所欲地查询和塑造数据。您只需按以下顺序订购即可。
  • 从你的描述...不会是101数学,102物理,103科学,104生物学吗?
  • 对于这个数据 Excel 应该做的...... ;)

标签: mysql sql database postgresql


【解决方案1】:

一个 SQL 表代表一个 无序 集合。没有“中间”的概念(或第一个或最后一个或上一个或下一个)。行只是;它们在表中。

查询返回具有顺序的结果集。而且,您可以在编写查询时控制顺序。这就是您使用order by 子句的原因。当你写:

select *
from mytable;

结果按数据库想要返回的任何顺序排列。根本没有任何保证。相反,查询数据库为:

select *
from mytable
order by col1;

你会得到正确排序的数据。

故事的寓意:只需将数据插入表中。当您查询它时,使用order by 子句以您想要的顺序获得结果。

【讨论】:

  • 我已经有一个 5000 行的表,我需要在问题中提到的 50 个位置插入一些行,这不能手动完成。
【解决方案2】:

嗯嗯。

您使用的行和列似乎不是数据库中应有的那样。

但是,您的问题的解决方案是这样做:

对于每个数学,从新行开始:

ID  Stuff
100 Maths Science Biology
200 Maths Science Biology Geography
300 Maths Science 

要读取此数据结构,您将从第一个索引开始,并为字符串中的每个条目添加 1。

例如,当“展开”时,

100 Maths Science Biology

会变成

Maths = ID + 1
Science = ID + 2
Biology = ID + 3 

...

现在,添加一个新的Stuff

当一个新的东西被添加时,找到它应该经过的地方并插入它,然后当你再次“展开”字符串时,新插入的将是有序的。

100 Maths Physics Science Biology

会变成

Maths = ID + 1    = 101
Physics = ID + 2  = 102
Science = ID + 3  = 103
Biology = ID + 4  = 104

...

【讨论】:

    【解决方案3】:

    正如其他人所指出的,关系数据库并不真正适用于有序列表。 您可以制定一些复杂的解决方案,例如选择“数学”行,然后选择“科学”行,然后使用它插入“物理”行。

    类似:

    CREATE TABLE temp_table AS
    (
    (SELECT 
    t1.id+1 AS id,
    'Physics' AS course
    FROM 
    table t1 JOIN table t2 
    ON 
    t1.course='Maths' AND t2.course='Science' AND t1.id+1=t2.id)
    UNION
    SELECT * FROM TABLE)
    

    然后使用 rank() 窗口函数更新其他标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多