Oracle 9i 之前,視圖僅為儲存的查詢(Stored Query),不支援任何約束定義。這導致應用層需重複驗證資料完整性,且無法利用資料庫原生機制保證跨視圖的一致性。Oracle 9i 打破此限制,引入視圖約束功能。
| 約束類型 | 語法支援 | 來源/行為 | 用途 |
|---|---|---|---|
| NOT NULL | 隱含繼承 | 自動從基表對應欄位繼承 | 防止關鍵欄位為 NULL |
| UNIQUE | 可顯式定義 | 任意欄位/組合可定義 | 確保視圖層面唯一性 |
| PRIMARY KEY | 可顯式定義 | 直接對視圖定義 PK | 識別視圖行、支援外鍵參考 |
| FOREIGN KEY | 隱含存在 | 若視圖依賴基表 FK,則自動存在 | 維護跨視圖/基表參考完整性 |
CREATE OR REPLACE VIEW widget_orders AS
SELECT
c.cust_name,
o.order_date,
p.product_name,
SUM(oi.qty * oi.price) AS total_cost
FROM customer c
NATURAL JOIN orders o
NATURAL JOIN order_item oi
NATURAL JOIN product p
WHERE p.product_type = 'widget';
ALTER VIEW widget_orders
ADD CONSTRAINT widget_orders_pk
PRIMARY KEY (cust_name, order_date, product_name)
DISABLE NOVALIDATE;
關鍵字解析:
DISABLE:不強制執行約束檢查NOVALIDATE:不驗證現有資料是否滿足約束ALTER VIEW widget_orders
ADD CONSTRAINT widget_orders_uk
UNIQUE (cust_name, order_date)
DISABLE NOVALIDATE;
若基表 orders 有 FK 指向 customer,視圖透過 NATURAL JOIN 保留該關係,則視圖層面隱含擁有 FK 語義,無需額外語法。
| 狀態組合 | 執行檢查 | 驗證現有資料 | 適用場景 |
|---|---|---|---|
| ENABLE VALIDATE | 是 | 是 | 嚴格生產環境(預設) |
| ENABLE NOVALIDATE | 是 | 否 | 新資料檢查,舊資料信任 |
| DISABLE VALIDATE | 否 | 是 | 資料載入階段,載入後 ENABLE |
| DISABLE NOVALIDATE | 否 | 否 | 元資料宣告、查詢優化輔助 |
DISABLE NOVALIDATE,不阻擋 DMLENABLE VALIDATE 會對視圖查詢產生額外驗證開銷,生產環境慎用SELECT
vc.owner, vc.view_name, vc.constraint_name,
vc.constraint_type, vc.status, vc.validated,
vc.rely -- RELY 屬性:優化器是否信任此約束
FROM user_view_constraints vc
ORDER BY vc.view_name, vc.constraint_type;
COMMENT ON CONSTRAINT 記錄業務含義ANALYZE ... VALIDATE CONSTRAINT(離線窗口)Oracle 9i 視圖約束雖不強制執行,但作為元資料宣告機制,為優化器、物化視圖、應用治理提供關鍵語義資訊。正確使用 DISABLE NOVALIDATE 定義 PK/UK,是提升複雜視圖查詢效能、規範資料介面的低成本高收益實踐。