簡體   English   中英

MSSQL 控制序列

[英]MSSQL controlling sequence

我需要一種管理表中序列的方法。 我有一張需要按順序管理的表。 我必須能夠在其他兩行之間插入一行。 如果我有一個從 1 到 10000 的編號序列,並且我想在 100 和 101 之間插入一行。或者我想將 99 移動到 1 和 2 之間。

這可以在 SQL 中管理還是我需要以編程方式管理它。

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;

SQL 不會以任何特定順序在表中存儲數據,當您使用索引或其他查詢查看數據時,它只是以這種方式存儲。 您必須有一個用於對數據進行排序的 ID 列。 在兩個當前行之間插入數據並不容易(例如,在 100 和 101 之間插入需要您重新編號所有 101<)。

實現此目的的一種方法是讓您的序列不連續。 也就是說,在序列上指定一個增量以留下足以放置交錯行的間隙。 如果這當然不完美,因為您可能會耗盡您的行內間隙,但這是一個開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM