以下是引用有容就大在2014-1-27 23:38:54的发言:
老大 你这么一讲我有点明白了
不过还有点疑问,我在实际操作时是无法修改视图数据的
为什么有些书上说:由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。
还有:视图可帮助用户屏蔽真实表结构变化带来的影响。 如果我基表干掉了一个字段 视图怎么屏蔽这个影响?
視圖,其實是一個查詢結果,具體實現的手段,不同語言有不同的方式。比如我上面所舉的例子,數據結構本身拆分爲姓、名兩個字段,查詢時構建一個臨時變量,用這兩個字段拼接而成,那麽修改這個臨時變量就不能修改字段本身,有些查詢操作也不允許修改這個臨時變量,寫程序的都知道,能否做什麽事,是程序員自己決定的,你當然也可以設定能够修改,并且在修改時把内部的字段本身也改動了,那是隱式操作。諸如SQL這類查詢語言,是把數據庫中的數據提取、運算之後構建成一個全新的臨時表供應給用戶的,相當於複印,修改複印件不能修改正本,是顯而易見的。但有一些語言,在查詢不是很複雜預算的視圖時,在可以將臨時字段與正本字段建立對應關係時,卻可能提供附帶變動源數據的功能(像新版vfp提供的某些SQL語句就有update參數,可以在修改視圖的時候修改源數據)。這就是所謂基於邏輯的原因,能或不能,邏輯,不過是具體實現的意思。
屏蔽的問題,還是那個例子。你新構建的查詢字段,可以是先姓後名,也可以先名後姓,甚至把名改了其他什麽東西再拼接起來,都是自由的,從得到的視圖結構,反推不到原本的字段結構。你幹掉一個字段,祇要查詢的公式(其實查詢視圖不過是一條公式,查詢臨時表是用這條公式在運行時新建的,是動態邏輯數據,與原表的物理永久數據不同性質)不涉及這個字段,就屏蔽掉了。其實,從同一個數據庫,根據不同用戶的需求,查詢出不同的結果,就是數據庫的用途——你的身份證數據,可以被社保局用,也可以被公安局用,兩者所需的身份證數據,存在同一數據庫中,按各自的需求提取各自的信息,但社保局的查詢查不到公安局才用得著的字段,反過來也一樣。所謂“大數據”,不過是這種意思而已。