2016-07-14 65 views
0

我想在特定位置向SQL服务器表中插入一行。例如,我的表有100行,我也有一个名为LineNumber的字段,我想要在第9行后面插入一个新行。但表中PK的ID列已经有一行LineNumber 9.所以现在我需要行号为9或10的新行,以便ID字段必须自动更新。我如何在这个位置插入一行,以便它后面的所有行转移到下一个位置?如何在任何表的中间插入新记录

+1

表格固有地未排序,所以您不能插入一条记录“在中间”。你能改说你的问题吗? – HoneyBadger

+0

这只是一次性交易或您需要定期执行的事情吗? –

+0

请提供样品数据。 – NEER

回答

-1

两个步骤,第一更新LineNumber上

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

然后做你插入

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

OP声明这个字段是主键,所以这将不起作用,因为10可能已经被采取 – Tanner

+0

我以前尝试过,但它没有为我工作 – yashu

+0

我同意使用排序的主键是不好的设计 – Jonny

-1

是什么让这个困难的是,该列是主键。如果您可以在没有其他人时与数据库交互,那么您可以这样做:

  • 使该列不再是主键。
  • 这样运行的命令:
UPDATE MyTable 
    SET PrimaryColumnID = PrimaryColumnID + 1 
WHERE PrimaryColumnID > 8 
  • 插入行与适当PrimaryColumnID(9)。
  • 将列还原为主键。

很明显,这可能不适用于大型表格。您可以创建一个新的主键列并将其切换,然后修复这些值,然后将其切换回来。

+0

不好的建议只是“让列不再是主键”,许多事情可能依赖于主键,那么对于任何引用链接表中主键的东西,你会做什么? – Tanner

+0

@坦纳只是暂时。当然,我认为桌子可以单独使用。 –

+0

@tanner你有没有在测试数据库中做过这件事?我当然有。你为50个州制定了一个表格,然后意识到你没有按字母顺序排列它们,所以你放下主键,对它们重新编号,然后再加入主键。然后当你复制到现场时,它的顺序是正确的。 –

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 
*/ 
相关问题