2011-04-26 82 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