2016-04-28 46 views
1

我需要一种管理表中的序列的方法。我有一张需要由序列管理的表格。我必须能够在另外两行之间插入一行。 如果我有一个从1到10000的数字序列,并且我想要插入一个100到101之间的行。或者我想将99移动到1和2之间。MSSQL控制序列

这可以在SQL中管理还是需要以编程方式管理它。

回答

1

SQL Server表没有任何隐式命令!

强制执行序列的唯一方法是具有唯一值的可排序列(或列的组合)。实现这一

一个办法是后号码您行现有排序关键字:

  • 添加一列SORTKEY BIGINT(使用值填充它,你应该把它设置为NOT NULL后,并创建一个unique index

这充分工作的例子会告诉你如何做到这一点:

CREATE TABLE #Dummy(SomeExistingSortField INT, SomeContent VARCHAR(100)); 
INSERT INTO #Dummy VALUES(3,'insert first'),(1,'insert second'),(2,'insert third'); 

SELECT * FROM #Dummy; 

ALTER TABLE #Dummy ADD SortKey BIGINT; 

WITH CTE AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT SomeExistingSortField)) * 10 AS nr 
      ,SortKey 
    FROM #Dummy 
) 
UPDATE CTE SET SortKey=nr; 

SELECT * FROM #Dummy ORDER BY SortKey; 

INSERT INTO #Dummy VALUES(99,'between 1 and 2',15); 

SELECT * FROM #Dummy ORDER BY SortKey; 

WITH CTE AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT SortKey)) * 10 AS nr 
      ,SortKey 
    FROM #Dummy 
) 
UPDATE CTE SET SortKey=nr; 

SELECT * FROM #Dummy ORDER BY SortKey; 

GO 
DROP TABLE #Dummy; 
+0

@ user625079,对不起,你是对的,我是这个快...我将修改我的答案在几分钟内... – Shnugo

+0

我想这 SELECT Q.RowNumber FROM(SELECT ROW_NUMBER ()OVER(ORDER BY [oldkey])* 10 AS RowNumber FROM Mytable )AS Q ORDER BY RowNumber及其好的。但是,当我更新我只加10在每一个新seqkey – user625079

+0

此更新将在10所有seqkey UPDATE MYTABLE SET SeqKey = Q.RowNumber FROM(SELECT ROW_NUMBER()OVER(ORDER BY oldkey)* 10 ROWNUMBER FROM mytable )AS Q – user625079

0

SQL不会以任何特定顺序在表中存储数据,它只是在您使用索引或其他查询查看数据时出现的方式。您必须拥有用于对数据进行排序的ID列。在两个当前行之间插入数据并不容易(例如,要在100和101之间插入数据,需要对所有数据重新编号101 <)。

0

一个办法accompl这是为了让你的序列不连续。也就是说,在序列上指定一个增量以留出足够空间以放置交错行。如果当然这不是完美的,因为你可能会耗尽你的行内空白,但这是一个开始。