2016-07-14 49 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 
*/