Oracle9i出現之前,Oracle視圖(View)總是從它們的基表(base tables)中動態產生的,並且視圖中不能包含約束。通過隱藏所有的內部表格連接操作,Oracle視圖可以簡化複雜的查詢。


 


例如,下面的視圖用以顯示五金(widget)產品的訂貨資訊。



create or replace view
   widget_orders
as
select
   cust_name,
   order_date,
   product_name,
   sum(qty*price) total cost
from
   customer
natural join
   orders
natural join
   order_item
natural join
   product
where
   product_type = 'widget';



 


在定義了這個視圖之後,我們就能過對它進行複雜的查詢。



select * from widget_orders where order_date > sysdate-5;



 


傳統的視圖所帶來的問題就是我們不能對視圖定義參考完整性約束(referential integrity constraints)。從Oracle9i開始,Oracle支持下面的視圖約束。


 


非空(NOT NULL):這個約束總是從創建視圖的基表中繼承而來的。


 


唯一性約束(Unique constraints):Oracle9i允許對視圖的任意一欄定義唯性約束。


 


主鍵(Primary key):我們可以直接給視圖定義主鍵約束。


 


外鍵(Foreign Key):只要視圖有依賴於其他基表的外鍵,那麼就會直接存在外鍵參考完整性。


 


正如你所知道的那樣,對視圖的參考完整約束進行管理會極大的影響到查詢的性能。

   
Oracle9i中,我們能夠回避非約束視圖所帶來的問題。下面的例子對一個視圖創建了主鍵約束。



alter view
   widget_orders
add constraint
   widget_orders_pk
primary key
   (cust_name, order_date, product_name)
disable novalidate;



 


全站熱搜
創作者介紹
創作者 噗噗噗的潛水珽 的頭像
噗噗噗的潛水珽

潛水珽的異想世界

噗噗噗的潛水珽 發表在 痞客邦 留言(0) 人氣()