十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
create TABLE zhao(

為馬鞍山等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及馬鞍山網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計、成都網(wǎng)站建設、馬鞍山網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
id number primary key,
mingcheng nvarchar2(50),
neirong nvarchar2(50),
jiezhiriqi date,
zhuangtai nvarchar2(50)
);
create TABLE tou(
id number primary key,
zhao_id number,
toubiaoqiye nvarchar2(50),
biaoshuneirong nvarchar2(50),
toubiaoriqi date,
baojia number,
zhuangtai nvarchar2(50),
foreign KEY(zhao_id) REFERENCES zhao(id)
);
foreign key (zhao_id) references to zhao(id)
多了個to
create TABLE zhao(\x0d\x0a id number primary key,\x0d\x0a mingcheng nvarchar2(50),\x0d\x0a neirong nvarchar2(50),\x0d\x0a jiezhiriqi date,\x0d\x0a zhuangtai nvarchar2(50)\x0d\x0a);\x0d\x0acreate TABLE tou(\x0d\x0a id number primary key,\x0d\x0a zhao_id number,\x0d\x0a toubiaoqiye nvarchar2(50),\x0d\x0a biaoshuneirong nvarchar2(50),\x0d\x0a toubiaoriqi date,\x0d\x0a baojia number,\x0d\x0a zhuangtai nvarchar2(50),\x0d\x0a foreign KEY(zhao_id) REFERENCES zhao(id)\x0d\x0a);\x0d\x0aforeign key (zhao_id) references to zhao(id)\x0d\x0a多了個to
;?? 外鍵約束保證參照完整性 外鍵約束限定了一個列的取值范圍 一個例子就是限定州名縮寫在一個有限值集合中 這個值集合是另外一個控制結構——一張父表
下面我們創(chuàng)建一張參照表 它提供了完整的州縮寫列表 然后使用參照完整性確保學生們有正確的州縮寫 第一張表是州參照表 State作為主鍵
CREATE TABLE state_lookup(state????? VARCHAR ( ) ? state_desc VARCHAR ( )) TABLESPACE student_data; ALTER TABLE state_lookup? ADD CONSTRAINT pk_state_lookup PRIMARY KEY (state)? USING INDEX TABLESPACE student_index;
然后插入幾行記錄
INSERT INTO state_lookup VALUES ( CA California );INSERT INTO state_lookup VALUES ( NY New York );INSERT INTO state_lookup VALUES ( NC North Carolina );
我們通過實現(xiàn)父子關系來保證參照完整性 圖示如下
外鍵字段存在于Students表中|State_lookup? |? 是State字段 ?? 一個外鍵必須參照主鍵或Unique字段?|?????????? 這個例子中 我們參照的是State字段?|?????????? 它是一個主鍵字段(參看DDL)?????????? /|\? |? Students??? |?
上圖顯示了State_Lookup表和Students表間一對多的關系 State_Lookup表定義了州縮寫通用集合——在表中每一個州出現(xiàn)一次 因此 State_Lookup表的主鍵是State字段
State_Lookup表中的一個州名可以在Students表中出現(xiàn)多次 有許多學生來自同一個州 一次 在表State_Lookup和Students之間參照完整性實現(xiàn)了一對多的關系
外鍵同時保證Students表中State字段的完整性 每一個學生總是有個State_lookup表中成員的州縮寫
外鍵約束創(chuàng)建在子表 下面在students表上創(chuàng)建一個外鍵約束 State字段參照state_lookup表的主鍵
創(chuàng)建表
CREATE TABLE students(student_id??? VARCHAR ( ) NOT NULL student_name? VARCHAR ( ) NOT NULL college_major VARCHAR ( ) NOT NULL status??????? VARCHAR ( ) NOT NULL state???????? VARCHAR ( ) license_no??? VARCHAR ( )) TABLESPACE student_data;
創(chuàng)建主鍵
ALTER TABLE studentsADD CONSTRAINT pk_students PRIMARY KEY (student_id)USING INDEX TABLESPACE student_index;
創(chuàng)建Unique約束
ALTER TABLE studentsADD CONSTRAINT uk_students_licenseUNIQUE (state license_no)USING INDEX TABLESPACE student_index;
創(chuàng)建Check約束
ALTER TABLE studentsADD CONSTRAINT ck_students_st_licCHECK ((state IS NULL AND license_no IS NULL) OR(state IS NOT NULL AND license_no is NOT NULL));
創(chuàng)建外鍵約束
ALTER TABLE studentsADD CONSTRAINT fk_students_stateFOREIGN KEY (state) REFERENCES state_lookup (state);
一 Errors的四種類型
參照完整性規(guī)則在父表更新刪除期間和子表插入更新期間強制執(zhí)行 被參照完整性影響的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的值
下面示例說明四種錯誤類型
測試表結構及測試數(shù)據(jù)如下
STATE_LOOKUP State????????? State DescriptionCA???????????? CaliforniaNY???????????? New YorkNC???????????? North Carolina STUDENTS Student ID??? Student Name??? College Major??? Status??? State????? License NOA ????????? John??????????? Biology????????? Degree???? NULL????? NULLA ????????? Mary??????????? Math/Science???? Degree???? NULL????? NULLA ????????? Kathryn???????? History????????? Degree???? CA??????? MV A ????????? Steven????????? Biology????????? Degree???? NY??????? MV A ????????? William???????? English????????? Degree???? NC??????? MV
) PARENT UPDATE
SQL UPDATE state_lookup? ? SET state = XX ? ? WHERE state = CA ; UPDATE state_lookup*ERROR at line :ORA : integrity constraint (SCOTT FK_STUDENTS_STATE)violated 每 child record found
) PARENT DELETE
SQL DELETE FROM state_lookup???? ? WHERE state = CA ; DELETE FROM state_lookup*ERROR at line :ORA : integrity constraint (SCOTT FK_STUDENTS_STATE)violated 每 child record found
) CHILD INSERT
SQL INSERT INTO STUDENTS? ? VALUES ( A ? ? Joseph History Degree XX MV ); INSERT INTO STUDENTS*ERROR at line :ORA : integrity constraint (SCOTT FK_STUDENTS_STATE)violated parent key not found
) CHILD UPDATE
SQL UPDATE students? ? SET state = XX ? ? WHERE student_id = A ; UPDATE students*ERROR at line :ORA : integrity constraint (SCOTT FK_STUDENTS_STATE)violated parent key not found
上面四種類型錯誤都有一個同樣的錯誤代碼 ORA
參照完整性是數(shù)據(jù)庫設計的關鍵一部分 一個既不是其他表的父表也不是子表的表是非常少的
二 級聯(lián)刪除
外鍵語法有個選項可以指定級聯(lián)刪除特征 這個特征僅作用于父表的刪除語句
使用這個選項 父表的一個刪除操作將會自動刪除所有相關的子表記錄
使用創(chuàng)建外鍵約束的DELETE CASCADE選項 然后跟著一條delete語句 刪除state_lookup表中California的記錄及students表中所有有California執(zhí)照的學生
ALTER TABLE studentsADD CONSTRAINT fk_students_stateFOREIGN KEY (state) REFERENCES state_lookup (state)ON DELETE CASCADE;執(zhí)行刪除語句 DELETE FROM state_lookup WHERE state = CA ;
然后再查詢students表中的數(shù)據(jù) 就沒有了字段state值為CA的記錄了
如果表間有外鍵關聯(lián) 但沒有使用級聯(lián)刪除選項 那么刪除操作將會失敗
定義一個級聯(lián)刪除時需要考慮下面問題
級聯(lián)刪除是否適合本應用?從一個父參照表的以外刪除不應該刪除客戶帳號
定義的鏈是什么?查看表與其他表的關聯(lián) 考慮潛在的影響和一次刪除的數(shù)量級及它會帶來什么樣的影響
如果不能級聯(lián)刪除 可設置子表外鍵字段值為null 使用on delete set null語句(外鍵字段不能設置not null約束)
ALTER TABLE studentsADD CONSTRAINT fk_students_stateFOREIGN KEY (state) REFERENCES state_lookup (state)ON DELETE SET NULL;
三 參照字段語法結構
創(chuàng)建外鍵約束是 外鍵字段參照父表的主鍵或Unique約束字段 這種情況下可以不指定外鍵參照字段名 如下 ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup 當沒有指定參照字段時 默認參照字段是父表的主鍵
如果外鍵字段參照的是Unique而非Primary Key字段 必須在add constraint語句中指定字段名
四 不同用戶模式和數(shù)據(jù)庫實例間的參照完整性
lishixinzhi/Article/program/Oracle/201311/17654
-- 創(chuàng)建測試主表. ID 是主鍵.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 創(chuàng)建測試子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 創(chuàng)建外鍵
ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;
以oracle自帶的用戶scott為例。
create?table?dept(
deptno?number(2)?primary?key,?--deptno?為?dept表的主鍵
dname?varchar2(10),
loc?varchar2(9)
);
create?table?emp(
empno?number(4)?primary?key,?--empno?為?emp表的主鍵
ename?varchar2(10),
job?varchar2(9),
mgr?number(4),
hiredate?date,
sal?number(7,2),
comm?number(7,2),
deptno?number(2)?references?dept(deptno)?--dept表中deptno字段?為?emp表的外鍵
);
3
stuid
number(10)
references
t_stu(stuid)
就是這個字段關聯(lián)t_stu表的stuid字段;
4
couseid
number(10),
5
constraint
fk_couseid
foreign
key(couseid)
6
references
t_couse(couseid)
7
on
delete
cascade);
這個是外鍵關聯(lián),并做同步刪除操作,就是如果t_couse表中的某個couseid數(shù)據(jù)被刪除了,那么這張表相關的數(shù)據(jù)也會自動被刪除;跟上面的區(qū)別就在于有沒有做刪除操作;
on
delete
cascade
就是同步刪除的意思,比如t_couse表中有個couseid=5,t_score表中也有couseid=5的數(shù)據(jù),當刪除t_couse表中couseid=5的數(shù)據(jù)時,t_score表中所有couseid=5的數(shù)據(jù)也會自動刪除;
可以寫在同一行,但是要用逗號分格開;
望采納,碼字不容易