Sql-Server
插入記錄的順序不匹配
請檢查下面的表結構和要插入該表的記錄。
CREATE TABLE [tabGeneraltable]( id int identity, [codGenLedger] [uniqueidentifier] NOT NULL, [codInvoice] [numeric](18, 0) NULL, [accountValue] [numeric](18, 2) NULL, [articleValue] [nvarchar](50) NULL, [codFinAccount] [int] NULL, [documentNbr] [nvarchar](50) NULL, [valueDate] [datetime] NULL, [insertDate] [datetime] NULL, CONSTRAINT [PK_tabGeneralLedger] PRIMARY KEY CLUSTERED([codGenLedger] ASC) ) insert into [tabGeneraltable]([codGenLedger],[codInvoice], [codFinAccount], [accountValue],[insertDate]) select NEWID(),1,11,232,getdate() union all select NEWID(),10,45,214,getdate() union all select NEWID(),9,425,410,getdate() union all select NEWID(),14,475,356,getdate()
插入所有記錄後,在此表上執行簡單的選擇語句時,例如
select * from tabGeneraltable
標識列 ID 的順序不正確或記錄是隨機插入的。(
insertDate
如果單獨插入所有記錄,請檢查列值。)為什麼會這樣?
**如果您沒有指定 order by 子句,您的 RDBMS 可以自由地返回它選擇的結果。**通常它會按照它可以最快檢索記錄的順序返回結果。
由於您將列
codGenLedger
作為聚集鍵,因此記錄將按codGenLedger
物理順序儲存在磁碟上(除非您的索引是碎片化的,但它們仍按該順序讀取)。您的 RDBMS 很可能會在您的範例中執行聚集索引掃描,並返回按聚集索引排序的結果。
有關 sql server 範例,請參閱此 sqlfiddle。
這實際上是按您的唯一標識符排序的,當您按字母順序查看它時,它看起來並不像它,而是按二進制數據的十六進製表示排序。
有關完整說明,請參見此處。
事實上,數據是排序的;它只是沒有按照您期望的方式排序。SQL Server 將全域唯一標識符 (GUID) 數據顯示為一系列字母數字字元串,但 uniqueidentifier 數據類型等效於 binary(16) 數據類型。您看到的 GUID 值只是二進制值的十六進製表示。所以數據是按這個十六進製表示排序的,而不是按字母順序。