回答
update table set col1 = col1-1 where col1>2
如果操作系统在SQL Server中使用实际的“身份”列,这将不起作用,因为它们不可更新。 – 2011-04-26 10:12:46
@Martin - yups那是真的,你不能改变 – 2011-04-26 10:14:17
什么是OP?在这里请让我知道 – 2011-04-26 10:44:34
答案1.你不想。 id字段的全部目的是不变的。
答案2.你不想。如果你需要这样做,id字段根本不是一个id字段,而是一个数据字段。
回答3.删除记录,并重新插入新的数字。 你可以看到,如果行数很大,这会变得非常昂贵。
在很多情况下,如果您删除并重新插入,删除的ID将不会被重复使用,而是将使用序列中新的未使用的ID – dplante 2012-05-24 03:35:38
使用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性能,这可能是一个不错的选择。这种方法的缺点是查询表格更困难。
+1但是,这不会更好地描述为[单链表]( http://en.wikipedia.org/wiki/Singly_linked_list)? – onedaywhen 2011-04-27 09:09:33
@oneday,是的,我更新了答案以使用正确的术语。 – Ronnis 2011-04-27 19:45:14
- 1. 如何在不更改rowversion的情况下更新记录
- 2. 如何在这种情况下更新我的行?
- 3. LinqtoSQL/C#:如何在这种情况下
- 4. 如何在这种情况下
- 5. 如何在这种情况下
- 6. 是在这种情况下
- 7. 在这种情况下
- 8. 在这种情况下如何释放记忆?
- 9. 如何在这种情况下释放记忆?
- 10. Knockoutjs在这种情况下不更新UI
- 11. ProgressBar properychangeListener在这种情况下不更新
- 12. 如何在这种情况下检测新行
- 13. jQuery的这种情况下
- 14. 知道这种情况下
- 15. 如何插入或更新数据库排在这种情况下
- 16. 如何在这种情况下更新现有的数据属性数组?
- 17. 在这种情况下GetEnumerator不存在
- 18. 在没有先查询的情况下更新记录?
- 19. 在哪种情况下建议使用ActiveResource?而在这种情况下呢?
- 20. 这种情况下的哪种控制?
- 21. 情况下,更新
- 22. 验证字段在这种情况下
- 23. 我peterson_lock在这种情况下
- 24. ON DELETE CASCADE在这种情况下?
- 25. htaccess的 - 在这种情况下
- 26. sched_yield在这种情况下做什么?
- 27. .map()在这种情况下做什么?
- 28. Ajax在这两种情况下运行
- 29. 我怎么能在这种情况下
- 30. 在这种情况下使用Bridge?
为什么你需要这样做?如果有差距,应该没有关系。如果您需要从ID中派生连续的数字序列,则Oracle和SQL Server都支持“ROW_NUMBER”。 – 2011-04-26 10:09:04
问题不是如何,而是为什么?你想通过保证表中连续的数字STORED和MAINTAINED来完成什么? – tbone 2011-04-26 11:29:43
* frds * ...是* fjords *的缩写吗? – 2011-04-27 04:53:04