2010-03-15 59 views
5

我有一個表CreateDate datetime字段default(getdate())沒有任何標識列。如何控制SQL Server中新標識列的賦值順序?

我想添加identity(1,1)字段,該字段將反映現有記錄的相同順序爲CreateDate字段(order by會給出相同的結果)。我怎樣才能做到這一點?

我想如果我在CreateDate字段上創建聚簇鍵然後添加標識列它將工作(不知道它是否有保證),有沒有更好的方法?

我感興趣的SQL Server 2005,但我想答案是爲SQL Server 2008,SQL Server 2000中

回答

8

從Remus的理論答案繼......你需要與你的理想訂貨

SELECT 
    ID, CreateDate 
INTO 
    MyNewTable 
FROM 
    (
    SELECT 
     CreateDate, 
     ROW_NUMBER() OVER (ORDER BY CreateDate ASC) AS ID 
    FROM 
     MyTable 
    ) foo 

然後首先生成一個列表,最好的解決方法是使用SSMS的IDENTITY屬性添加到MyNewTable 。 SSMS將生成一個腳本,包括SET IDENTITY INSERT維護秩序

注:IDENTITY列只是沒有隱含意義,並沒有什麼應該由他們與這個練習後CREATEDATE對準推斷數字...

1

當你懷疑一樣,它會根據聚簇索引添加。否則,你必須從某處的代碼中完成它。

+2

不,它不會。只有ORDER BY子句將保證ORDER – gbn 2010-03-15 20:19:06

+0

@gbn每次插入標識列時,自動編號的順序都與聚集索引匹配。我已經依靠這種行爲來獲得我希望的訂單。你是說這種行爲不能保證,可能不會發生,我很幸運? – 2010-03-15 21:21:33

+0

@Patrick:IDENTITY可能會留下空隙,它記錄在MSDN上:「如果一個標識列存在頻繁刪除的表,那麼標識值之間可能會出現空隙。」 – 2010-03-15 21:26:16

2

IDENTITY值通常與物理存儲順序正交。特別是,由於日期時間分辨率爲3ms,允許多行具有相同的日期時間,所以標識並不總是與日期時間聚集鍵順序相匹配。同樣,如果原始時間綁定到客戶端機器(即中間層,asp層,用戶機器等),那麼機器之間的時間漂移​​也將確保插入順序(IDENTITY會給出什麼)和存儲順序之間的差異。

如果您需要行順序整數,請在投影列表中使用ROW_NUMBER()。如果您需要用於ORM目的的IDENTITY主鍵,請使用IDENTITY列並將其索引爲非聚集索引。

永遠不要混淆物理存儲需求(集羣密鑰)和邏輯建模需求(主鍵)。

+0

如果你冷靜下來,請解釋爲什麼,作爲基本的禮貌。 – 2010-03-15 21:26:47

+0

對不起,那是我。我根本不相信你回答了這個問題。我*同意*與您的陳述(除了我的標識列幾乎總是聚集索引),但它們沒有幫助。他希望通過添加自動編號字段來改進他的設計/清晰度/索引/ foreignKeys;我幾次遇到過他的情況。我確信他希望有一個自動編號開始。他不想隨機數字開始我們,他希望他們至少*匹配他們被添加的順序。有總比沒有好。如何做到這一點是他的問題。 – 2010-03-15 22:09:40

+0

是的,但在添加標識列之後會發生什麼* next *?他珍視的物理秩序 - 身份價值的映射將在5分鐘內消失。我的整篇文章是關於如何從未*依靠這樣的映射。 – 2010-03-15 22:18:06