我們在應用程序開發的時候,經常會遇到這樣的一種情況:附屬表更新了,主表的數據沒有更新,這個關聯表不只是外鍵的關聯(通過附屬表 ID 關聯),主表中還會存在一些附屬表的字段,這樣一般做的目的是,在查詢顯示的時候減少關聯(性能考慮)。凡事都有相對性,比如我們有時候會對附屬表中的數據進行更新,如果沒有對附屬字段添加觸發器,這時候就造成附屬表中的數據和主表不一致,沒辦法,我們需要對這些“過時數據”進行手動“刷新”。
比如我們有 PRoduct 和 Provider 表,一個商品對應一個提供商,表結構如下(只做演示):
Product 和 Provider 表之間的關系通過 ProviderID 字段進行關聯,ProviderName 這個字段就是上面我們說,為了減少關聯查詢用的,那如果 Provider 表中的 Name 值更新了,如何更新 Product 表中的 ProviderName 值呢?
問題分析這個數據更新的問題,其實現在看來非常簡單,但是我當時在解決這個問題的時候,莫名其妙多了很多想法,對于程序員來說,兩個數據集的對應數據更新,我們怎么處理呢?最簡單的是遍歷然后再另一個數據集中進行查找,然后對查找后的結果進行修改保存,這是一般做法,比如下面的這段偽代碼:
DataView product = new DataView(); DataView provider = new DataView(); foreach (DataRow item in provider) { product.RowFilter = string.Format("ProviderID={0}", item["ID"]); //todo... }
上面這段代碼是我們一般不經過大腦寫出來的,試著想一下,如果存在幾十萬甚至幾百萬的數據,這種方式程序肯定會運行到明年,不可否認,當時我想過這種方式實現的,而且還是想寫個程序腳本來完成數據更新,這是多么的不靠譜啊。
如果不用程序去完成數據更新,我們就得寫 SQL 腳本,數據庫也不是很熟悉,只能說會簡單的語法(select),連修改列的屬性都忘了,幸虧在去年畢業的時候,整理了一個簡單 T-SQL 系列《T-Sql學習系列完結》,現在看來,當時真是太明智了,雖然這些簡單的語法網上一找一大堆,但還是覺得自己整理的看著舒服。
實現上面數據更新有很多方式,我當時還想過用游標操作,但是一想和程序中的 foreach 有什么區別的呢?還是覺得干點實事吧,最后有了下面的一段 SQL 腳本,針對上面 Product 和 Provider 表的數據更新:
update [dbo].[Product] set [dbo].[Product].ProviderName=[dbo].[Provider].Name from [dbo].[Provider] where [dbo].[Product].ProviderID=[dbo].[Provider].ID and ....
就這么簡單,當時卻花了很長的時間,甚至還有個疑問:不是一個數據庫的表進行數據更新,可以用 SQL 實現嗎?有點可笑,其實一個數據庫實例下,跨數據庫訪問表的話,直接在表名之前加數據庫名稱就行了。
新聞熱點
疑難解答