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

时间:2016-07-14 13:04:13

标签: sql-server

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

3 个答案:

答案 0 :(得分: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
*/

答案 1 :(得分:-1)

两个步骤,首先更新LineNumber

UPDATE
    table
SET
    LineNumber = LineNumber + 1
WHERE
    LineNumber>9

然后执行插入

INSERT INTO table
(LineNumber, ...) VALUES (10, .....)

答案 2 :(得分:-1)

使这一点变得困难的是该列是主键。如果您可以在没有其他人的情况下与数据库进行交互,那么您可以这样做:

  • 使列不再是主键。
  • 运行如下命令:
UPDATE MyTable
    SET PrimaryColumnID = PrimaryColumnID + 1
WHERE PrimaryColumnID > 8
  • 使用相应的PrimaryColumnID(9)插入行。
  • 将列还原为主键。

显然,对于一张大桌子来说,这可能不会很好。您可以创建一个新的主键列并将其切换,然后修复这些值,然后将其切换回来。