这是我的问题:
我想在我的表中插入一个新行,但其中已经有一些寄存器。如果我需要将这个新行放在已经注册的同一行,我该怎么办?
例如:
我有这个行的表:
ID|Value
1 |Sample1
2 |Sample2
3 |Sample3
但是现在我想在Sample2中插入一个新行,所以表格应该是:
ID|Value
1 |Sample1
2 |NewSample
3 |Sample2
4 |Sample3
有什么想法吗?
答案 0 :(得分:2)
简单的方法是添加一个新列 - 将其设置为与ID相同的值,然后您有两个选择,如果您将其设为数字,则只需在其间添加一个值
ID | Value | OrderCol
1 | Sample1 | 1
4 | NewSample | 1.5
2 | Sample2 | 2
3 | Sample3 | 3
你的另一个选择是重新编号 - 如果表格中有很多东西,这可能会很慢。
您可能不想更改ID,因为可能有一个引用此标识符的外部表。
答案 1 :(得分:2)
有什么想法吗?
是。如果您在某处有引用,请忘记更改主键(ID)。
而是添加一个列(例如ViewOrder),它明确地为您处理:
ID|Value | ViewOrder
1 |Sample1 |1
5 |NewSample |2
2 |Sample2 |3
3 |Sample3 |4
查询选择:
SELECT ID, Value, ViewOrder FROM yourTable ORDER BY ViewORDER
插入/更新看起来像这样(当然,YourRowIndex是您希望插入新行的索引):
UPDATE dbo.table SET VIEWORDER = VIEWORDER + 1 WHERE VIEWORDER >= @YourRowIndex ;
SET IDENTITY_INSERT dbo.table ON
INSERT dbo.table (Value, ViewOrder) VALUES (@YourValue, @YourRowIndex);
答案 2 :(得分:0)
在SQL Server中,基本方法是:
DECLARE @value VARCHAR(32), @ID INT = 2;
UPDATE dbo.table SET ID = ID + 1 WHERE ID >= 2;
INSERT dbo.table (ID, Value) SELECT @ID, @Value;
但请记住,如果在其他表中引用这些值,或者最终用户知道ID = 3当前引用的是什么,这将使所有这些值变得混乱(或者不可能)。
同样重要的是要记住,根据定义,表格是一组无序的行 - 表中没有“中间”。