如何在任何表的中间插入新记录

Pol*_*nna 0 sql-server

我想在特定位置的SQL服务器表中插入一行.例如,我的表有100行,而且我有一个名为LineNumber的字段,我想在第9行之后插入一个新行.但是表的PK的ID列已经有一行含有LineNumber 9.所以现在我需要行号为9或10的新行,以便ID字段必须自动更新.如何在此位置插入一行,以便在它移动到下一个位置后的所有行?

Tan*_*ner 5

不要修改主键,这不是修改输出顺序的好方法,因为您有要插入的新记录.

在表格中添加新列以保存您的订单.然后,在对新行进行所需更改之前,如果这是您当前的订单,则可以将主键值复制到该列.

您应该能够复制和粘贴并按原样运行的示例:

我添加了orderid列,您需要使用默认的空值.

DECLARE @OrderTable AS TABLE
    (
      id INT ,
      val VARCHAR(5) ,
      orderid INT
    )

INSERT  INTO @OrderTable
        ( id, val, orderid )
VALUES  ( 1, 'aaa', NULL )
        ,
        ( 2, 'bbb', NULL )
        ,
        ( 3, 'ddd', NULL )

SELECT  *
FROM    @OrderTable

-- Produces:
/*
id  val orderid
1   aaa NULL
2   bbb NULL
3   ddd NULL
*/

-- Update the `orderid` column to your existing order:

UPDATE  @OrderTable
SET     orderid = id

SELECT  *
FROM    @OrderTable

-- Produces:
/*
id  val orderid
1   aaa 1
2   bbb 2
3   ddd 3
*/

-- Then you want to add a new item to change the order:

DECLARE @newVal AS NVARCHAR(5) = 'ccc'
DECLARE @newValOrder AS INT = 3

-- Update the table to prepare for the new row:

UPDATE  @OrderTable
SET     orderid = orderid + 1
WHERE   orderid >= 3

-- this inserts ID = 4, which is what your primary key would do by default
-- this is just an example with hard coded value
INSERT  INTO @OrderTable
        ( id, val, orderid )
VALUES  ( 4, @newVal, @newValOrder )

-- Select the data, using the new order column:

SELECT  *
FROM    @OrderTable
ORDER BY orderid 

-- Produces:
/*
id  val orderid
1   aaa 1
2   bbb 2
4   ccc 3
3   ddd 4
*/
Run Code Online (Sandbox Code Playgroud)