2012-04-28 40 views
2

我繼承了一個公司數據庫,它將訂單號作爲GUID發佈。當你想引用你的訂單號碼時,不完全用戶友好!所以我想要做的是添加一個新的int列,併爲每個現有訂單添加一個唯一的連續訂單號(已按照datetime排序)。帶順序整數的更新表

這是一個好主意,但我堅持如何實際做到更新查詢!任何幫助將不勝感激。

+0

當您添加數字標識符時,爲什麼不放棄GUID?當然,你不需要爲每一行都提供一個簡單的和廣泛的唯一標識符... – 2012-04-28 17:36:06

+0

@ Aaron Bertrand。感謝那。即將到來,但因爲我對所有系統都陌生,所以我沒有確定如何連接所有東西。我從那以後發現GUID不是由我的SQL Server生成的,而是在後面的頁面代碼中可能導致某個點發生衝突。所以它必須去! – ComfortablyNumb 2012-05-03 09:13:30

回答

3

單程。

alter table t add order_id int identity 

這將添加一個自動遞增的int標識列。無法保證將ID分配給現有行的順序,但是將爲每個現有行分配唯一的ID。在此更改後插入的每個新行都將獲得一個新的唯一標識。

在將此應用程序應用於實際應用程序之前,請考慮現有代碼是否適用於標識列。通常這種方法是非常無害的升級。嘗試插入標識列的代碼失敗,除非它使用set identity_insert。您不能刪除標識屬性而不刪除列。

爲了完成此操作,可能需要對新ID進行唯一性約束,以便檢索速度以及在更新ID列時強制實施唯一性。

+1

即使IDENTITY_INSERT爲ON,您也無法修改IDENTITY列。它被稱爲IDENTITY_INSERT,而不是IDENTITY_INSERT_OR_UPDATE。 – 2012-04-28 17:58:13

+0

@AaronBertrand好抓。我對身份認同的一些不幸事實就是將其消除。 – joshp 2012-04-28 18:11:03

5

identity column添加到您的表中,編號將爲您照顧。

alter table YourTable add YourTableID int identity 
2

不幸的是,如果您只是在表中添加IDENTITY列,現有訂單不一定會獲得按OrderDate順序分配的IDENTITY值,因此如果您要分配訂單ID值,它們將會「無序」基於訂單日期(這似乎是合乎邏輯的)。簡單的例子:

CREATE TABLE dbo.Orders 
(
    OrderGUID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
    OrderDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 

INSERT dbo.Orders(OrderDate) VALUES 
('20120101'), ('20120102'), ('20120103'); 
GO 

ALTER TABLE dbo.Orders ADD OrderID INT IDENTITY(1,1); 
GO 
SELECT OrderID, OrderGUID, OrderDate = CONVERT(DATE, OrderDate) 
FROM dbo.Orders 
ORDER BY OrderDate; 

結果(當然你會有所不同):

OrderID OrderGUID       OrderDate 
------- ------------------------------------ ---------- 
2  C5CE909E-0469-45AE-A828-647C7F54AA14 2012-01-01 
1  70D8EEB1-FDA8-4E56-874F-771999C6DB84 2012-01-02 
3  8E7B42C3-6C4D-4860-8A82-AFADDBA96A4A 2012-01-03 

如果這是不能接受的,你或許應該創建一個新表,並插入所有舊訂單到它(此時你也可以像我在我的評論中暗示的那樣刪除GUID列)。

CREATE TABLE dbo.OrdersCopy 
(
    OrderID INT IDENTITY(1,1) PRIMARY KEY, 
    ... other columns ... 
); 

INSERT dbo.OrdersCopy (OrderDate, ... other columns ...) 
SELECT OrderDate, ... other columns ... 
FROM dbo.Orders 
ORDER BY OrderDate 
OPTION (MAXDOP 1); -- single-threaded is important! 

EXEC sp_rename 'dbo.Orders', 'OrdersOld', 'OBJECT'; 
EXEC sp_rename 'dbo.OrdersCopy', 'Orders', 'OBJECT'; 

(如果你想保留舊的GUID供參考,是暫時的,而你清理其它表,這可能是罰款,但你不應該讓它再自動填充,你應該計劃要刪除因爲它很寬且很多。)

+0

謝謝你的... – ComfortablyNumb 2012-04-30 08:34:25