SQL如何在表的中间插入新行

时间:2013-12-09 16:27:38

标签: sql sql-server

这是我的问题:

我想在我的表中插入一个新行,但其中已经有一些寄存器。如果我需要将这个新行放在已经注册的同一行,我该怎么办?

例如:

我有这个行的表:

ID|Value
1 |Sample1
2 |Sample2
3 |Sample3

但是现在我想在Sample2中插入一个新行,所以表格应该是:

ID|Value
1 |Sample1
2 |NewSample
3 |Sample2
4 |Sample3

有什么想法吗?

3 个答案:

答案 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当前引用的是什么,这将使所有这些值变得混乱(或者不可能)。

同样重要的是要记住,根据定义,表格是一组无序的行 - 表中没有“中间”。