2011-04-26 64 views
1

我连续存储了id为1,2,3,4的各种活动。如何在这种情况下更新记录?

如果我删除第二条记录(id 2),我该如何更新以使3变成2而4变成3?

在此先感谢

+1

为什么你需要这样做?如果有差距,应该没有关系。如果您需要从ID中派生连续的数字序列,则Oracle和SQL Server都支持“ROW_NUMBER”。 – 2011-04-26 10:09:04

+0

问题不是如何,而是为什么?你想通过保证表中连续的数字STORED和MAINTAINED来完成什么? – tbone 2011-04-26 11:29:43

+2

* frds * ...是* fjords *的缩写吗? – 2011-04-27 04:53:04

回答

1
update table set col1 = col1-1 where col1>2 
+0

如果操作系统在SQL Server中使用实际的“身份”列,这将不起作用,因为它们不可更新。 – 2011-04-26 10:12:46

+0

@Martin - yups那是真的,你不能改变 – 2011-04-26 10:14:17

+0

什么是OP?在这里请让我知道 – 2011-04-26 10:44:34

1

答案1.你不想。 id字段的全部目的是不变的。

答案2.你不想。如果你需要这样做,id字段根本不是一个id字段,而是一个数据字段。

回答3.删除记录,并重新插入新的数字。 你可以看到,如果行数很大,这会变得非常昂贵。

+0

在很多情况下,如果您删除并重新插入,删除的ID将不会被重复使用,而是将使用序列中新的未使用的ID – dplante 2012-05-24 03:35:38

1

使用linked list方法取而代之,每个活动指向下一个方向怎么样?

select * from activity; 
+----+---------+ 
| id | next_id | 
+----+---------+ 
| 1 |  2 | 
| 2 |  3 | 
| 3 |  4 | 
| 4 |  5 | 
| 5 | NULL | 
+----+---------+ 

如果你想删除与ID = 2的活动,您需要更新指向ID = 2到ID = 2先前指向行的行。

update activity 
    set next_id = 3 
where id = 1; 

delete 
    from activity 
where id = 2; 

+----+---------+ 
| id | next_id | 
+----+---------+ 
| 1 |  3 | 
| 3 |  4 | 
| 4 |  5 | 
| 5 | NULL | 
+----+---------+ 

如果您有很长的列表并担心DML性能,这可能是一个不错的选择。这种方法的缺点是查询表格更困难。

+0

+1但是,这不会更好地描述为[单链表]( http://en.wikipedia.org/wiki/Singly_linked_list)? – onedaywhen 2011-04-27 09:09:33

+0

@oneday,是的,我更新了答案以使用正确的术语。 – Ronnis 2011-04-27 19:45:14