2008-12-18 60 views
2

我有這個表在我的SQL Express 2005數據庫:的SQL Server 2005:自然排序順序與唯一約束兩列的表

CREATE TABLE [dbo].[test_sort_order](
    [Col1] [int] IDENTITY(1,1) NOT NULL, 
    [Col2] [nchar](50) COLLATE French_CI_AS NULL, 
CONSTRAINT [PK_test_sort_order] PRIMARY KEY CLUSTERED 
(
    [Col1] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY], 
CONSTRAINT [UQ_test_sort_order] UNIQUE NONCLUSTERED 
(
    [Col2] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

當運行反對平坦的SQL查詢(通常SELECT * FROM test_sort_order)我得到根據第二列(Col2)排序的結果集

我期望它能夠(自然地)對PK列進行排序(事實上這是記錄插入的順序) 實際上,如果你從Col2中刪除了唯一的約束,這就是你得到的。

當你保持唯一約束並且向該表添加第三列(任何類型)時,事情變得更加神祕,因爲SELECT *的結果然後按照自然順序排序。

任何想法爲什麼這樣的行爲?以及如何擺脫它。 謝謝

回答

3

SELECT是一個面向集合的操作,並且由於集合是無序的,除非明確使用ORDER BY,否則結果集中沒有特定的順序。