Oracle定義約束 外來鍵約束
外來鍵約束保證參照完整性。外來鍵約束限定了一個列的取值範圍。一個例子就是限定州名縮寫在一個有限值集合中,這個值集合是另外一個控制結構——一張父表
下面我們建立一張參照表,它提供了完整的州縮寫列表,然後使用參照完整性確保學生們有正確的州縮寫。第一張表是州參照表,State作為主鍵
(state VARCHAR2(2),
state_desc VARCHAR2(30)) TABLESPACE student_data;
ADD CONSTRAINT pk_state_lookup PRIMARY KEY (state)
USING INDEX TABLESPACE student_index;
然後插入幾行記錄:
INSERT INTO state_lookup VALUES ('NY', 'New York');
INSERT INTO state_lookup VALUES ('NC', 'North Carolina');
我們通過實現父子關係來保證參照完整性,圖示如下
|State_lookup | 是State欄位
--------------- 一個外來鍵必須參照主鍵或Unique欄位
| 這個例子中,我們參照的是State欄位
| 它是一個主鍵欄位(參看DDL)
/|\
---------------
| Students |
---------------
上圖顯示了State_Lookup表和Students表間一對多的關係,State_Lookup表定義了州縮寫通用集合——在表中每一個州出現一次。因此,State_Lookup表的主鍵是State欄位。
State_Lookup表中的一個州名可以在Students表中出現多次。有許多學生來自同一個州,一次,在表State_Lookup和Students之間參照完整性實現了一對多的關係。
外來鍵同時保證Students表中State欄位的完整性。每一個學生總是有個State_lookup表中成員的州縮寫。
外來鍵約束建立在子表。下面在students表上建立一個外來鍵約束。State欄位參照state_lookup表的主鍵。
1、建立表
(student_id VARCHAR2(10) NOT NULL,
student_name VARCHAR2(30) NOT NULL,
college_major VARCHAR2(15) NOT NULL,
status VARCHAR2(20) NOT NULL,
state VARCHAR2(2),
license_no VARCHAR2(30)) TABLESPACE student_data;
2、建立主鍵
ADD CONSTRAINT pk_students PRIMARY KEY (student_id)
USING INDEX TABLESPACE student_index;
3、建立Unique約束
ADD CONSTRAINT uk_students_license
UNIQUE (state, license_no)
USING INDEX TABLESPACE student_index;
4、建立Check約束
ADD CONSTRAINT ck_students_st_lic
CHECK ((state IS NULL AND license_no IS NULL) OR
(state IS NOT NULL AND license_no is NOT NULL));
5、建立外來鍵約束
ADD CONSTRAINT fk_students_state
FOREIGN KEY (state) REFERENCES state_lookup (state);
參照完整性規則在父表更新刪除期間和子表插入更新期間強制執行。被參照完整性影響的SQL語句是:PARENT-UPDATE 父表更新操作 不能把State_lookup表中的state值更新為students表仍在使用而State_lookup表中卻沒有的值。
PARENT-DELETE 父表刪除操作 不能刪除State_lookup表中的state值後導致students表仍在使用而state_lookup表中卻沒有這個值。
CHILD-INSERT 子表插入操作 不能插入一個state_llokup表中沒有的state的值CHILD-UPDATE 子表更新操作 不能把state的值更新為state_lookup表中沒有的state的值
下面示例說明四種錯誤型別:
--------------------------------
State State Description
CA California
NY New York
NC North Carolina
---------------------------------
STUDENTS
--------------------------------------------------------------------------------
Student ID Student Name College Major Status State License NO
A101 John Biology Degree NULL NULL
A102 Mary Math/Science Degree NULL NULL
A103 Kathryn History Degree CA MV-232-13
A104 Steven Biology Degree NY MV-232-14
A105 William English Degree NC MV-232-15
--------------------------------------------------------------------------------
1)、PARENT-UPDATE
2 SET state = 'XX'
3 WHERE state = 'CA';
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_STUDENTS_STATE)
violated 每 child record found
2 WHERE state = 'CA';
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_STUDENTS_STATE)
violated 每 child record found
3)、CHILD-INSERT
2 VALUES ('A000',
3 'Joseph','History','Degree','XX','MV-232-00');
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_STUDENTS_STATE)
violated - parent key not found
4)、CHILD-UPDATE
2 SET state = 'XX'
3 WHERE student_id = 'A103';
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_STUDENTS_STATE)
violated - parent key not found
參照完整性是資料庫設計的關鍵一部分。一個既不是其他表的父表也不是子表的表是非常少的。
二、級聯刪除
外來鍵語法有個選項可以指定級聯刪除特徵。這個特徵僅作用於父表的刪除語句。
使用這個選項,父表的一個刪除操作將會自動刪除所有相關的子表記錄。
使用建立外來鍵約束的DELETE CASCADE選項,然後跟著一條delete語句,刪除state_lookup表中California的記錄及students表中所有有California執照的學生。
ADD CONSTRAINT fk_students_state
FOREIGN KEY (state) REFERENCES state_lookup (state)
ON DELETE CASCADE;
執行刪除語句:
DELETE FROM state_lookup WHERE state = 'CA';
然後再查詢students表中的資料,就沒有了欄位state值為CA的記錄了。
如果表間有外來鍵關聯,但沒有使用級聯刪除選項,那麼刪除操作將會失敗。
定義一個級聯刪除時需要考慮下面問題:
1、級聯刪除是否適合本應用?從一個父參照表的以外刪除不應該刪除客戶帳號
2、定義的鏈是什麼?檢視錶與其他表的關聯,考慮潛在的影響和一次刪除的數量級及它會帶來什麼樣的影響
如果不能級聯刪除,可設定子表外來鍵欄位值為null,使用on delete set null語句(外來鍵欄位不能設定not null約束)。
ADD CONSTRAINT fk_students_state
FOREIGN KEY (state) REFERENCES state_lookup (state)
ON DELETE SET NULL;
三、參照欄位語法結構
建立外來鍵約束是,外來鍵欄位參照父表的主鍵或Unique約束欄位。這種情況下可以不指定外來鍵參照欄位名,如下:ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup;當沒有指定參照欄位時,預設參照欄位是父表的主鍵。
如果外來鍵欄位參照的是Unique而非Primary Key欄位,必須在add constraint語句中指定欄位名。
四、不同使用者模式和資料庫例項間的參照完整性
外來鍵約束可以在不同使用者模式及不同資料庫例項間應用,但從一個資料庫管理觀點來說,這是不希望的。一個應用放在一個使用者模式下是比較合適的。這裡不再詳述
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16486600/viewspace-544551/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Javaweb-約束-外來鍵約束JavaWeb
- 外來鍵約束
- oracle外來鍵約束的總結Oracle
- 關於外來鍵約束
- 約束外來鍵筆記筆記
- SQL外來鍵約束的含義及建立SQL
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- 教你mysql如何增加外來鍵約束MySql
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- ts函式約束定義函式
- ts類介面約束定義
- mysql不能新增外來鍵約束怎麼辦MySql
- 聊聊Oracle外來鍵約束(Foreign Key)的幾個操作選項Oracle
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- 主鍵約束、唯一約束和唯一索引索引
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- mysql~資料完整性考慮~外來鍵約束MySql
- oracle 註釋和約束Oracle
- 約束
- 批量刪除MSSQL 中主外來鍵約束SQL
- 10、Oracle中的約 束constraintOracleAI
- 在 MotionScene 檔案中定義場景約束
- 約束CONSTRAINTAI
- 03約束
- MySQL 約束MySql
- SQL約束SQL
- Xilinx約束學習筆記(二)—— 定義時鐘筆記
- (10)邏輯綜合新增約束(環境約束)
- 資料遷移無法新增外來鍵約束,錯誤程式碼 1215
- 約束介紹
- 差分約束
- 綜合約束
- [20180423]關於閃回表與主外來鍵約束.txt
- MariaDB資料庫的外來鍵約束例項程式碼介紹詳解資料庫
- 完整性約束
- SQLServer約束介紹SQLServer
- IDELAY約束測試IDE
- MySQL自增約束MySql
- Javaweb-約束案例JavaWeb