簡體   English   中英

將標識列添加到現有表作為主鍵並更改順序

[英]add an identity column to existing table as the primary key and change order

我有一張表,里面有超過700萬條記錄。 該表沒有主鍵。 我想添加一個新的標識列並將其設置為主鍵。 我嘗試使用SSMS添加列,然后將其設置為主鍵。 我把這個新列稱為Id。

這幾乎可以工作,但我想將表的默認順序更改為基於另一列,例如日期時間列按降序排列。 這可能嗎? 也許我需要使用臨時表和ROW_NUMBER()函數。

但是,我不是很擅長SQL。 有人可以幫忙嗎?

我還需要一個回滾腳本,以便我可以回到原始表。

這是另一個想法:

步驟1 - 在“日期時間列按降序排列”上創建臨時聚簇索引

CREATE CLUSTERED INDEX ix_YourTableTEMP ON YourTable (DateTimeColumn DESC)

第2步 - 添加標識列。 現在ID 應該按照之前創建的索引的順序排列 - 雖然我不認為這有100%的保證。

ALTER TABLE YourTable ADD IdColumn INT IDENTITY(1,1)

Step3 - 刪除臨時索引

DROP INDEX  ix_YourTableTEMP ON YourTable 

步驟4 - 在新列上創建新的群集PK

ALTER TABLE YourTable 
ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (IdColumn)

鏈接馬丁史密斯給出的可能是最好的答案,但這里有一個替代方案:

-- CREATE TABLE WITH SOME DATA IN
CREATE TABLE T (X INT);
INSERT T VALUES (1), (2), (3);

-- CREATE A CLONE OF THIS TABLE, ADDING AN IDENTITY COLUMN
-- USING ORDER BY TO AFFECT THE ORDER OF THE INSERT
SELECT  ID = IDENTITY(INT, 1, 1),
        T.*
INTO    T_Clone
FROM    T
ORDER BY X DESC;

-- DROP ORIGINAL TABLE
DROP TABLE T;

-- RENAME CLONE TABLE TO ORIGINAL TABLE NAME
EXECUTE SP_RENAME 'dbo.T_Clone', 'T', 'OBJECT';

-- SELECT FROM TABLE TO CHECK RESULTS
SELECT  *
FROM    T;

要回滾:

ALTER TABLE T DROP COLUMN ID;

編輯

已經指出SELECT ID = IDENTITY(INT, 1, 1).. INTO.. FROM .. ORDER BY ...不保證插入的順序。 因此,似乎故障安全選項是使用CREATE TABLE語法創建克隆表並添加IDENTITY列:

CREATE TABLE T_Clone
(       ID      INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
        <your columns>
);
INSERT T_Clone (<your columns>)
SELECT  <your columns>
FROM    T
ORDER BY ...;

然后繼續使用Drop並重命名如上。 我找不到任何文檔說這個方法對於訂購插件是不可靠的,如果它證明仍然不可靠你可以使用:

SET IDENTITY_INSERT T_Clone ON;
INSERT T_Clone (ID, <your columns>)
SELECT  ROW_NUMBER() OVER(ORDER BY ...),
        <your columns>
FROM    T;

SET IDENTITY_INSERT T_Clone OFF;

然后在插入后重新設置T_CLone。

暫無
暫無

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

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