我們建立表的時候,經常會使用自增的編號,比如在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路分類器。卷積 池化都是下取樣操作。下取樣降低資料的耦合性,增加了網路的不變性 乙個畫素和它周圍的畫素相...