2012-02-07 53 views
3

我被告知在我的最後一個位置永遠不要這樣做;沒有解釋爲什麼。我明白它增加了錯誤的機會,但是如果只有幾列,並且我對他們的順序有信心,爲什麼我不能簡化它,只是按照正確的順序插入值,而沒有明確地匹配列名?是否有很大的性能差異?如果是這樣,小規模重要嗎?插入查詢:爲什麼不包括列名是一個壞主意?

如果沒有性能問題,並且這不是一個將被保存供其他人查看的查詢,爲什麼我不應該?

在此先感謝。

+0

當然,我這樣做,並且事實證明,我這樣做,其實有保存這些腳本。現在我必須正確地重寫它們。編碼業力再次咬傷! – Yatrix 2012-02-08 14:48:21

回答

4

只有當您手動輸入查詢到交互式DB工具時,這纔是可接受的。當您的程序執行SQL語句時,除非您是唯一有權訪問數據庫的開發人員,否則您無法完全確信表中列的順序。換句話說,在任何團隊環境中,只要通過重新排序數據庫中的列,就有機會讓別人破壞您的查詢。從邏輯上講,你的表格將保持不變,但你的程序仍然會中斷。

+0

因此,在我使用此查詢的實例中,只需在腳本窗口中查看它就沒有問題,並且它將永遠不會再被看到。我認爲在大多數情況下這只是不好的做法,但我想我會問我是一個數據庫新手。多謝,夥計。 – Yatrix 2012-02-07 20:40:25

+1

這更多關於習慣。如果您訓練自己始終包含列列表,那麼當您編寫將*再次看到的內容時,您不會錯誤地忽略它們。 – 2012-02-07 20:43:48

3

魔鬼的擁護者:如果只有幾列,那麼它會給你帶來什麼?你保存了幾個按鍵,很重要。

對於一次性寫入並隨身攜帶的臨時查詢,這不是什麼大問題。我懷疑你被告知不要在生產代碼中執行此操作,或者其他任何人稍後必須進行逆向工程(不是簡單地理解它就是說明基礎模式更改)。請記住,您編寫的代碼可能只能由您現在查看和維護,但您應該編寫代碼,意圖是它會超過您。

包括列名單的另一個原因是好是如果你以後要搜索數據模型中一個特定的列名的所有引用...

0

在大多數開發商店,你不會是唯一的開發商在一個給定的項目上工作。在這種情況下,可能會出現意外插入的風險。現在或者在你離開之後,你現在可以確信不會有任何模式改變,事情也不會改變。

另外,如果添加了列,則插入將失敗。

0

它主要用於可讀性,所以如果它只是你的罰款,但如果你弄髒的順序也可以是一個很難解釋,如果人們發現你沒有使用好的做法,特別是如果有人修改了結構,而你正在編寫你的查詢...另外,如果你在列中有複雜的事情,它可以幫助可視化,如果你說它很小,那麼添加一些列名不會很長,所以你也可以。

0

因爲事情的變化,如果你在你的程序代碼查詢,以爲列的順序不會改變,然後沿着別人是決定更改表添加一個新列的查詢將失敗來。

0

此外,還有一個快速的訣竅,如果你不想要鍵入列名了。在管理工作室中,您可以進行設置,以便您的結果集以CSV格式返回(帶有列標題)。 CTRL-T。

然後做一個快速的,

select top 1 * from <tablename> 

,並從結果窗口複製並粘貼列的列表。

+0

有一個更快的方法。在對象資源管理器中,展開您的表格,然後將「列」節點拖到您的查詢窗口中。它沒有很好的格式,但他們都在那裏。 – 2012-02-07 20:39:54

+0

沒有意圖......但這不是更快。這要求你在對象瀏覽器中找到你的服務器,數據庫,表格,列。如果您經常爲查詢中的每個表格/視圖執行上述步驟,這樣做只會更快。通常,GUI =較慢的IMO。 – 2012-02-08 16:00:09

+0

呃,好吧,你猜我贏了。你的方式對我來說似乎非常麻煩,但人們也喜歡騎三輪車去工作...... 2012-02-08 16:04:06

1

原因是爲了使代碼更健壯。

指定字段會使代碼減少對錶格佈局保持完全相同的依賴,並且還使您能夠向表格中添加字段,而無需更改代碼,只要您爲新領域。

它還可以更容易地查看查詢應該執行的操作,而無需查看錶格佈局以查看數據將在何處結束。

+0

同意 - 它還可以更容易地找出哪些列無需前後往返表元數據。 – 2012-02-07 20:40:38

0

關係沒有列的從左到右排序。同樣不能說一個SQL表,不是一件好事。但是,僅僅因爲SQL具有非關係特性並不意味着您必須使用它們!將列列表指定爲表或行值構造函數的一部分是減輕SQL列排序的一種方法。

請考慮下面的SQL語句在語義上是等價的:

INSERT INTO Table1 (col1, col2, col3) VALUES (1, 2, 3); 

INSERT INTO Table1 (col2, col1, col3) VALUES (2, 1, 3); 

INSERT INTO Table1 (col3, col2, col1) VALUES (3, 2, 1); 
相關問題