我繼承了一個公司數據庫,它將訂單號作爲GUID發佈。當你想引用你的訂單號碼時,不完全用戶友好!所以我想要做的是添加一個新的int列,併爲每個現有訂單添加一個唯一的連續訂單號(已按照datetime排序)。帶順序整數的更新表
這是一個好主意,但我堅持如何實際做到更新查詢!任何幫助將不勝感激。
我繼承了一個公司數據庫,它將訂單號作爲GUID發佈。當你想引用你的訂單號碼時,不完全用戶友好!所以我想要做的是添加一個新的int列,併爲每個現有訂單添加一個唯一的連續訂單號(已按照datetime排序)。帶順序整數的更新表
這是一個好主意,但我堅持如何實際做到更新查詢!任何幫助將不勝感激。
單程。
alter table t add order_id int identity
這將添加一個自動遞增的int標識列。無法保證將ID分配給現有行的順序,但是將爲每個現有行分配唯一的ID。在此更改後插入的每個新行都將獲得一個新的唯一標識。
在將此應用程序應用於實際應用程序之前,請考慮現有代碼是否適用於標識列。通常這種方法是非常無害的升級。嘗試插入標識列的代碼失敗,除非它使用set identity_insert。您不能刪除標識屬性而不刪除列。
爲了完成此操作,可能需要對新ID進行唯一性約束,以便檢索速度以及在更新ID列時強制實施唯一性。
即使IDENTITY_INSERT爲ON,您也無法修改IDENTITY列。它被稱爲IDENTITY_INSERT,而不是IDENTITY_INSERT_OR_UPDATE。 – 2012-04-28 17:58:13
@AaronBertrand好抓。我對身份認同的一些不幸事實就是將其消除。 – joshp 2012-04-28 18:11:03
將identity column添加到您的表中,編號將爲您照顧。
alter table YourTable add YourTableID int identity
不幸的是,如果您只是在表中添加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供參考,是暫時的,而你清理其它表,這可能是罰款,但你不應該讓它再自動填充,你應該計劃要刪除因爲它很寬且很多。)
謝謝你的... – ComfortablyNumb 2012-04-30 08:34:25
當您添加數字標識符時,爲什麼不放棄GUID?當然,你不需要爲每一行都提供一個簡單的和廣泛的唯一標識符... – 2012-04-28 17:36:06
@ Aaron Bertrand。感謝那。即將到來,但因爲我對所有系統都陌生,所以我沒有確定如何連接所有東西。我從那以後發現GUID不是由我的SQL Server生成的,而是在後面的頁面代碼中可能導致某個點發生衝突。所以它必須去! – ComfortablyNumb 2012-05-03 09:13:30