我想在特定位置的SQL服务器表中插入一行。例如,我的表有100行,而且我有一个名为LineNumber的字段,我想在第9行之后插入一个新行。但是表的PK的ID列已经有一行含有LineNumber 9.所以现在我需要行号为9或10的新行,以便ID字段必须自动更新。如何在此位置插入一行,以便将其后的所有行移到下一个位置?
答案 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
显然,对于一张大桌子来说,这可能不会很好。您可以创建一个新的主键列并将其切换,然后修复这些值,然后将其切换回来。