sql 留心空洞

2021-06-17 19:42:41 字數 2025 閱讀 9773

我們建立表的時候,經常會使用自增的編號,比如在sql server 中用 identity ,在oracle中使用sequence,在mysql中有auto_increment

這些都很好用,只是經常會出現乙個不影響軟體正常執行的問題,打個比方:

現在有乙個表:

create  table invoice 

([id]   int identity(1,1)  , 

[customer]   varchar(10)

)然後隨便插入四個記錄

id    customer

1      a

2       b

3      c

4      4

然後刪除   b 的記錄,變成:

id    customer 

1     a

3     c

4     d

然後插入乙個新的e  :

insert into invoice(customer)

values 'e'

結果會得到:

id     customer 

1      a

3      c

4     d

5     e

問題就出現了:很多時候普通的使用者希望新增的e是補在原來的b上面的,而不是像      現在這個樣:子1  3   4  5中間少了個2的!

這個問題雖然不影響軟體的正常功能,不過在使用者的眼裡就是有那麼一點瑕疵。

《sql hacks》中把這個問題叫做「空洞」  ,  解決辦法有以下:

首先我們可以用乙個select語句找出所有的空洞:

select x.id as x_id , x.customer , y.id  as y_id

from invoice as x

left join invoice as y on ( x.id+1 = y.id )

應該得到:

x_id     customer    y_id

1           a                  null

2           b                   3

3           c                    4

4           d                     5

5            e                  null

可以發現「空洞」在第2個位置和第6個位置。

上面的圖就是join連線的過程了,很容易明白第2個位置是個「空洞」。而5之後沒有東西了,所以也看作「空洞」

接著我們用乙個select語句找出第乙個「空洞」吧!

select coalesce(min(x.id) , 0)+1  as 第乙個遺漏的編號

from invoice as x

left join invoice as y on (x.id+1=y.id)

where y.id is null

結果是:

第乙個遺漏的空洞

好吧,現在往「空洞」裡面插既可以了

insert into invoice (id ,customer)

select coalesce(min(x.id) , 0)+1 , 'drank bar'

from invoice as x

left join invoice as y on ( x.id+1=y.id )

where y.id is null

注釋:coalesce(part1 , part2)這個函式的意思是:

if   part1 !=null   return  part1

else  return  part2

空洞檔案1

ls l file 檢視檔案邏輯大小 du c file 檢視檔案實際占用的儲存塊多少 od c file 檢視檔案儲存的內容 空洞檔案是個啥玩意?就是有空洞的檔案,在日常的常識中,我們使用的檔案存放在硬碟分割槽上的時候,有多大的內容就會占用多大的空間,比如這個文字檔案裡面寫有1000個asc字元,...

linux 空洞檔案

我們都知道 lseek 系統呼叫可以改變檔案的偏移量,但如果程式呼叫使得檔案偏移量跨越了檔案結尾,然後再執行 i o 操作,將會發生什麼情況?read 呼叫會返回 0,表示檔案結尾。write 呼叫可以在檔案尾後的任意位置寫入資料。在這種情況下,對該檔案的下一次寫將延長該檔案,並在檔案中構成乙個空洞...

空洞卷積 dilated convolution

cnn在諸如分類 識別 任務中的處理過程一般是卷積 池化 全連線。這三種操作把資料轉換成多個低維度特徵,便於分類。如把一張128x416的影象轉換成乙個1x1x100的特徵圖,就可以做成乙個100路分類器。卷積 池化都是下取樣操作。下取樣降低資料的耦合性,增加了網路的不變性 乙個畫素和它周圍的畫素相...