在表中的两行之间插入一行

时间:2014-09-03 17:39:56

标签: mysql sql database postgresql

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

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

现在我需要在Maths和Science之间的所有位置插入一行Physics,表格应该如下所示

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

我很长时间都有这个问题。我在这里只提到了三次插入。在实际问题中,我需要在50多个地方的数学和科学之间进行这样的插入。手动操作非常困难。 任何人都可以指导我处理这种情况需要遵循的方法。

3 个答案:

答案 0 :(得分:3)

SQL表表示无序集。没有"中间"的概念(或第一个或最后一个或上一个或下一个)。行只是;他们在桌子旁。

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

select *
from mytable;

结果是数据库想要返回的任何顺序。根本没有保证。而是将数据库查询为:

select *
from mytable
order by col1;

您将获得正确订购的数据。

故事的寓意:只需将数据插入表格即可。查询时,请使用order by子句以所需顺序获取结果。

答案 1 :(得分:1)

Hmmmm。

您似乎并没有像在数据库中那样使用行和列。

但是,解决问题的方法是:

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

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

...

答案 2 :(得分:0)

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

类似的东西:

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()窗口函数来更新其他标签。