SQL – TRUNCATE vs DELETE

iSQlServer發表於2009-10-12

還是sqlservercentral.com的問題與解答。

問題:

Consider the following statements:

    create table #t (i int identity(1,1) not null, c varchar(5) not null)
    insert into #t (c) select 'one'
    truncate table #t
    insert into #t (c) select 'two'
    delete #t
    insert into #t (c) select 'three'
    select * from #t

What will be the result of the select query?
A. 1 , three
B. 2 , three
C. 3 , three

你的答案會是哪個呢?我又選錯了,選了C。如果兩次都是DELETE的話,那麼C不會錯咯。

那麼A呢?經過了兩次INSERT,不會還是1了吧。如果兩次都是TRUNCATE的話,那麼A也不會錯了。:),或者DELETE在前,TRUNCATE在後,也沒問題。

單選題,A和C都沒了,那答案就會是B咯。就像上面兩句的假設,一樣,由因得果咯。

我們看題,先是建立了一個TABLE,有兩個列,列 i 是整型的,並可自增長。列 c 是字元型的。

然後,就把 'one' 插入到TABLE。這時,TABLE裡面就有一行。其中列 i 是1,這個是自增長的。

接著,把TABLE #t 給TRUNCATE 了。TRUNCATE這個動作呢,就會把列 i 的計數器給復原為起始值了。這裡,TABLE沒記錄了,列 i 的計數器會迴歸為1。

再插入一個 'two' 到TABLE。TABLE又有了一行記錄,由於上一步的TRUNCATE,列 i 的計數器復位了,所以這個記錄的列 i 還會是1。

真費事,剛插入進去,又要DELETE了。但這次DELETE,不會復位列 i 的計數器。

又插一次 'three' 。由於列 i 的計數器沒有在上一步被複位,所以這時這一行新加的記錄裡面的列 i 將會是2。

也就是select * from #t 的結果,會是 2 , three 。

 

這個問題想說明,TRUNCATE 與 DELETE 的分別:TRUNCATE 會復位自增長列的計數器,而DELETE不會。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章