在oracle9i出現(xiàn)之前,oracle視圖總是從它們的基表(base tables)中動態(tài)產(chǎn)生的,并且視圖中不能包含約束。通過隱藏所有的內(nèi)部表格連接操作,oracle視圖可以簡化復(fù)雜的查詢。
例如,下面的視圖用以顯示五金(widget)產(chǎn)品的訂貨信息。
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';
在定義了這個視圖之后,我們就能過對它進(jìn)行復(fù)雜的查詢。
select * from widget_orders where order_date > sysdate-5;
傳統(tǒng)的視圖所帶來的問題就是我們不能對視圖定義參考完整性約束(referential integrity constraints)。從oracle9i開始,oracle支持下面的視圖約束。
非空(not null):這個約束總是從創(chuàng)建視圖的基表中繼承而來的。
唯一性約束(unique constraints):oracle9i允許對視圖的任意一欄定義唯一性約束。
主鍵(primary key):我們可以直接給視圖定義主鍵約束。
外鍵(foreign key):只要視圖有依賴于其它基表的外鍵,那么就會直接存在外鍵參考完整性。
正如你所知道的那樣,對視圖的參考完整約束進(jìn)行管理會極大的影響到查詢的性能。
在oracle9i中,我們能夠回避非約束視圖所帶來的問題。下面的例子對一個視圖創(chuàng)建了主鍵約束。
alter view
widget_orders
add constraint
widget_orders_pk
primary key
(cust_name, order_date, product_name)
disable novalidate;
最大的網(wǎng)站源碼資源下載站,
新聞熱點(diǎn)
疑難解答
圖片精選