2020年9月26日 星期六

T-SQL Insert 語法選型參考

觀察很多人寫 tsql insert 的習慣,慢慢拿捏出幾種風格的好處,以及在多變的情境下,

應該會採取的策略及相關注意事項。


還是先說說新增資料的兩種方式,我們有資料表 Persons 乙張,欄位設計如下


Id 為 Identify ,CreateOn 有預設 getdate()


第一式:明確指定欄位

可以使用以下語法新增資料,由於Id、Create 會自動或提供預設值,所以可以只指定Name與

Age 欄位即可。




第二式:使用預設全選欄位


由上圖可看出,會得到相同結果;使用以上好處是,不需要指定欄位,可直接在 VALUES 

關鍵字後面接要新增的資料,挺方便的



情境一:有可為Null 的欄位

先說結論,比較prefer 第一式的寫法,主要原因有以下幾種。



若「Note」欄位可為Null,且預設新建一定是空值,一般會塞入空字串(依照高效SQL設計,需要減少Null 值,

才會走索引搜尋)。此時會把欄位設定預設值為空,如下所示


所以若此時使用方法二,其實還是要手動塞值



但若使用第一式,較為方便



情境二:同表欄位擴充

雖說正式上線的功能,不應該隨便調整欄位,但實務上很難完全避免,即使要擴充也會思考看看,

是否可以新建資料表來達成,避免寬欄位;


若不幸的真要擴充欄位,來新增一欄位 ModifyOn ,不可為null 並且有預設值設定 getdate()





設計好按下儲存,既有的資料都會補上預設值



此時,使用第一式明確指定欄位的Insert 語法,不需要額外調整



但若原本使用第二式的語法就需要調整(多新增一個欄位值),如下圖



以上情境,萬一不幸的,系統已經運作一陣子,既有存在的語法就需要維護並且盤查,

若又加上資料操作語法品質沒有把關,新增資料管道多元,那就累了...。


故實務上一律嚴守明確指定欄位的新增資料撰寫方式,這應是最後一道還可以拉桿的防線了。


 

沒有留言:

張貼留言