成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

oracle如何更新外鍵 oracle 設(shè)置外鍵

oracle怎么創(chuàng)建外鍵?

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多了個(gè)to

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、和靜網(wǎng)站維護(hù)、網(wǎng)站推廣。

Oracle定義約束外鍵約束

;?? 外鍵約束保證參照完整性 外鍵約束限定了一個(gè)列的取值范圍 一個(gè)例子就是限定州名縮寫在一個(gè)有限值集合中 這個(gè)值集合是另外一個(gè)控制結(jié)構(gòu)——一張父表

下面我們創(chuàng)建一張參照表 它提供了完整的州縮寫列表 然后使用參照完整性確保學(xué)生們有正確的州縮寫 第一張表是州參照表 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 );

我們通過實(shí)現(xiàn)父子關(guān)系來保證參照完整性 圖示如下

外鍵字段存在于Students表中|State_lookup? |? 是State字段 ?? 一個(gè)外鍵必須參照主鍵或Unique字段?|?????????? 這個(gè)例子中 我們參照的是State字段?|?????????? 它是一個(gè)主鍵字段(參看DDL)?????????? /|\? |? Students??? |?

上圖顯示了State_Lookup表和Students表間一對(duì)多的關(guān)系 State_Lookup表定義了州縮寫通用集合——在表中每一個(gè)州出現(xiàn)一次 因此 State_Lookup表的主鍵是State字段

State_Lookup表中的一個(gè)州名可以在Students表中出現(xiàn)多次 有許多學(xué)生來自同一個(gè)州 一次 在表State_Lookup和Students之間參照完整性實(shí)現(xiàn)了一對(duì)多的關(guān)系

外鍵同時(shí)保證Students表中State字段的完整性 每一個(gè)學(xué)生總是有個(gè)State_lookup表中成員的州縮寫

外鍵約束創(chuàng)建在子表 下面在students表上創(chuàng)建一個(gè)外鍵約束 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ī)則在父表更新刪除期間和子表插入更新期間強(qiáng)制執(zhí)行 被參照完整性影響的SQL語(yǔ)句是 PARENT UPDATE?? 父表更新操作? 不能把State_lookup表中的state值更新為students表仍在使用而State_lookup表中卻沒有的值

PARENT DELETE?? 父表刪除操作? 不能刪除State_lookup表中的state值后導(dǎo)致students表仍在使用而state_lookup表中卻沒有這個(gè)值

CHILD INSERT??? 子表插入操作? 不能插入一個(gè)state_llokup表中沒有的state的值CHILD UPDATE??? 子表更新操作? 不能把state的值更新為state_lookup表中沒有的state的值

下面示例說明四種錯(cuò)誤類型

測(cè)試表結(jié)構(gòu)及測(cè)試數(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

上面四種類型錯(cuò)誤都有一個(gè)同樣的錯(cuò)誤代碼 ORA

參照完整性是數(shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵一部分 一個(gè)既不是其他表的父表也不是子表的表是非常少的

二 級(jí)聯(lián)刪除

外鍵語(yǔ)法有個(gè)選項(xiàng)可以指定級(jí)聯(lián)刪除特征 這個(gè)特征僅作用于父表的刪除語(yǔ)句

使用這個(gè)選項(xiàng) 父表的一個(gè)刪除操作將會(huì)自動(dòng)刪除所有相關(guān)的子表記錄

使用創(chuàng)建外鍵約束的DELETE CASCADE選項(xiàng) 然后跟著一條delete語(yǔ)句 刪除state_lookup表中California的記錄及students表中所有有California執(zhí)照的學(xué)生

ALTER TABLE studentsADD CONSTRAINT fk_students_stateFOREIGN KEY (state) REFERENCES state_lookup (state)ON DELETE CASCADE;執(zhí)行刪除語(yǔ)句 DELETE FROM state_lookup WHERE state = CA ;

然后再查詢students表中的數(shù)據(jù) 就沒有了字段state值為CA的記錄了

如果表間有外鍵關(guān)聯(lián) 但沒有使用級(jí)聯(lián)刪除選項(xiàng) 那么刪除操作將會(huì)失敗

定義一個(gè)級(jí)聯(lián)刪除時(shí)需要考慮下面問題

級(jí)聯(lián)刪除是否適合本應(yīng)用?從一個(gè)父參照表的以外刪除不應(yīng)該刪除客戶帳號(hào)

定義的鏈?zhǔn)鞘裁矗坎榭幢砼c其他表的關(guān)聯(lián) 考慮潛在的影響和一次刪除的數(shù)量級(jí)及它會(huì)帶來什么樣的影響

如果不能級(jí)聯(lián)刪除 可設(shè)置子表外鍵字段值為null 使用on delete set null語(yǔ)句(外鍵字段不能設(shè)置not null約束)

ALTER TABLE studentsADD CONSTRAINT fk_students_stateFOREIGN KEY (state) REFERENCES state_lookup (state)ON DELETE SET NULL;

三 參照字段語(yǔ)法結(jié)構(gòu)

創(chuàng)建外鍵約束是 外鍵字段參照父表的主鍵或Unique約束字段 這種情況下可以不指定外鍵參照字段名 如下 ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup 當(dāng)沒有指定參照字段時(shí) 默認(rèn)參照字段是父表的主鍵

如果外鍵字段參照的是Unique而非Primary Key字段 必須在add constraint語(yǔ)句中指定字段名

四 不同用戶模式和數(shù)據(jù)庫(kù)實(shí)例間的參照完整性

lishixinzhi/Article/program/Oracle/201311/17654

在oracle中怎樣用一條sql語(yǔ)句更新兩張有主外鍵關(guān)系的表的記錄

你要更新什么字段?

主表的

主鍵?

還是

主表的數(shù)據(jù)與子表的

非主鍵/外鍵

數(shù)據(jù),同時(shí)更新?

舉個(gè)例子吧。

小議Oracle外鍵約束修改行為(一)

Oracle的外鍵用來限制子表中參考的字段的值 必須在主表中存在 而且在主表的記錄發(fā)生變化導(dǎo)致外鍵參考唯一約束值發(fā)生了變化時(shí) 定義了一系列的動(dòng)作

在SQL 標(biāo)準(zhǔn)中定義了幾種外鍵改變后 如何處理子表記錄的動(dòng)作 其中包括

限制Restrict 這種方式不允許對(duì)被參考的記錄的鍵值執(zhí)行更新或刪除的操作 置為空Set to null 當(dāng)參考的數(shù)據(jù)被更新或者刪除 那么所有參考它的外鍵值被置為空

置為默認(rèn)值Set to default 當(dāng)參考的數(shù)據(jù)被更新或者刪除 那么所有參考它的外鍵值被置為一個(gè)默認(rèn)值

級(jí)聯(lián)Cascade 當(dāng)參考的數(shù)據(jù)被更新 則參考它的值同樣被更新 當(dāng)參考的數(shù)據(jù)被刪除 則參考它的子表記錄也被刪除

不做操作No action 這種方式不允許更新或刪除被參考的數(shù)據(jù) 和限制方式的區(qū)別在于 這種方式的檢查發(fā)生在語(yǔ)句執(zhí)行之后 Oracle默認(rèn)才會(huì)的方式就是這種方式

Oracle明確支持的方式包括No action Set to null和Cascade 對(duì)于Set to Default和Restrict Oracle的約束類型并不直接支持 不過可以通過觸發(fā)器來實(shí)現(xiàn)

簡(jiǎn)單看一下Oracle的默認(rèn)處理方式No action

SQL CREATE TABLE T_P (ID NUMBER NAME VARCHAR ( ));

表已創(chuàng)建

SQL ALTER TABLE T_P ADD PRIMARY KEY (ID);

表已更改

SQL CREATE TABLE T_C (ID NUMBER FID NUMBER NAME VARCHAR ( ));

表已創(chuàng)建

SQL ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);

表已更改

SQL INSERT INTO T_P VALUES ( A );

已創(chuàng)建 行

SQL INSERT INTO T_P VALUES ( B );

已創(chuàng)建 行

SQL INSERT INTO T_C VALUES ( A );

已創(chuàng)建 行

SQL MIT;

提交完成

對(duì)于No Action操作而言 如果主鍵的記錄被外鍵所參考 那么主鍵記錄是無(wú)法更新或刪除的

SQL DELETE T_P WHERE ID = ;DELETE T_P WHERE ID = *第 行出現(xiàn)錯(cuò)誤:ORA : 違反完整約束條件 (YANGTK FK_T_C) 已找到子記錄日志

SQL UPDATE T_P SET ID = WHERE ID = ;UPDATE T_P SET ID = WHERE ID = *第 行出現(xiàn)錯(cuò)誤:ORA : 違反完整約束條件 (YANGTK FK_T_C) 已找到子記錄日志

SQL DELETE T_P WHERE ID = ;

已刪除 行

不過No Action又和Restrict操作有所區(qū)別 No Action允許用戶執(zhí)行語(yǔ)句 在語(yǔ)句執(zhí)行之后 或者事務(wù)結(jié)束的時(shí)候才會(huì)檢查是否違反約束 而Restrict只有檢測(cè)到有外鍵參考主表的記錄 就不允許刪除和更新的操作執(zhí)行了

這也使得No Action操作支持延遲約束

SQL ALTER TABLE T_C DROP CONSTRAINT FK_T_C;

表已更改

SQL ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID) DEFERRABLE INITIALLY DEFERRED;

表已更改

SQL SELECT * FROM T_P;

ID NAME A

SQL SELECT * FROM T_C;

ID FID NAME A

SQL DELETE T_P WHERE ID = ;

已刪除 行

SQL INSERT INTO T_P VALUES ( A );

已創(chuàng)建 行

SQL MIT;

提交完成

lishixinzhi/Article/program/Oracle/201311/17487

Oracle外鍵與其主鍵的實(shí)際應(yīng)用方案

以下的文章主要是對(duì)Oracle主鍵與Oracle外鍵的實(shí)際應(yīng)用方案的介紹 此篇文章是我很然偶在一網(wǎng)站上發(fā)現(xiàn)的 如果你對(duì)Oracle主鍵與Oracle外鍵的實(shí)際應(yīng)用很感興趣的話 以下的文章就會(huì)給你提供更詳細(xì)的相關(guān)方面的知識(shí)

CREATE TABLE SCOTT MID_A_TAB

( A VARCHAR ( BYTE)

B VARCHAR ( BYTE)

DETPNO VARCHAR ( BYTE)

)TABLESPACE USERS ;

CREATE TABLE SCOTT MID_B_TAB

( A VARCHAR ( BYTE)

B VARCHAR ( BYTE)

DEPTNO VARCHAR ( BYTE)

)TABLESPACE USERS ;

給MID_A_TAB表添加主鍵

alter table mid_a_tab add constraint a_pk primary key (detpno);

給MID_B_TAB表添加Oracle主鍵

alter table mid_b_tab add constraint b_pk primary key(a);

給子表MID_B_TAB添加Oracle外鍵 并且引用主表MID_A_TAB的DETPNO列 并通過on delete cascade指定引用行為是級(jí)聯(lián)刪除

alter table mid_b_tab add constraint b_fk foreign key

(deptno) references mid_a_tab (detpno) on delete cascade;

向這樣就創(chuàng)建了好子表和Oracle主表

向主表添加數(shù)據(jù)記錄

SQL insert into mid_a_tab(a b detpno) values( );

已創(chuàng)建 行

已用時(shí)間: : :

向子表添加數(shù)據(jù)

SQL insert into mid_b_tab(a b deptno) values( );

insert into mid_b_tab values( )

*

第 行出現(xiàn)錯(cuò)誤:

ORA : 違反唯一約束條件 (SCOTT B_PK)

已用時(shí)間: : :

可見上面的異常信息 那時(shí)因?yàn)樽颖聿迦氲膁eptno的值是 然而此時(shí)我們主表中

detpno列只有一條記錄那就是 所以當(dāng)子表插入數(shù)據(jù)時(shí) 在父表中不能夠找到該引用

列的記錄 所以出現(xiàn)異常

但我們可以這樣對(duì)子表的數(shù)據(jù)的進(jìn)行插入(即 在子表的deptno列插入null 因?yàn)槲覀冊(cè)诮ū淼臅r(shí)候

并沒有對(duì)該列進(jìn)行not null的約束限制)

SQL insert into mid_b_tab(a b deptno) values( null);

已創(chuàng)建 行

已用時(shí)間: : :

現(xiàn)在如果我們把子表mid_b_tab中deptno列加上not null約束

SQL alter table mid_b_tab modify deptno not null;

alter table mid_b_tab modify deptno not null

*

第 行出現(xiàn)錯(cuò)誤:

ORA : 無(wú)法啟用 (SCOTT ) 找到空值

已用時(shí)間: : :

上面又出現(xiàn)異常 這是因?yàn)楝F(xiàn)在mid_b_tab表中有了一條記錄 就是我們先前添加的

那條記錄

null

現(xiàn)在我們要把該表的deptno列進(jìn)行not null約束限制 所以O(shè)racle不讓我們這樣干

那我們就只有把該表給delete或truncate掉 然后在修改deptno列為非空

SQL delete from mid_b_tab;

已刪除 行

已用時(shí)間: : :

再次修改子表mid_b_tab表的deptno列為非空

SQL alter table mid_b_tab modify deptno not null;

表已更改

已用時(shí)間: : :

修改成功!

我們?cè)俅尾迦霐?shù)據(jù)

insert into mid_b_tab(a b deptno) values( null);

試試

SQL insert into mid_b_tab(a b deptno) values( null);

insert into mid_b_tab(a b deptno) values( null)

*

第 行出現(xiàn)錯(cuò)誤:

ORA : 無(wú)法將 NULL 插入 ( SCOTT MID_B_TAB DEPTNO )

已用時(shí)間: : :

看見現(xiàn)在Oracle不讓我們插入空值了

所以我們?cè)趧?chuàng)建子表的Oracle外鍵約束時(shí) 該表的引用列必須要進(jìn)行not null限制 也可以在

該列創(chuàng)建unique 或primary key約束 并且引用列與被引用列的數(shù)據(jù)類型必須相同

SQL insert into mid_b_tab(a b deptno) values( );

已創(chuàng)建 行

已用時(shí)間: : :

此時(shí)數(shù)據(jù)插入成功 因?yàn)榇藭r(shí)插入的 在主表中的被引用列中已經(jīng)存在了

現(xiàn)在我們一系列的操作

SQL select * from mid_b_tab ;

A B DE

已用時(shí)間: : :

SQL select * from mid_a_tab;

A B DE

已用時(shí)間: : :

SQL delete from mid_a_tab;

已刪除 行

lishixinzhi/Article/program/Oracle/201311/18331

文章標(biāo)題:oracle如何更新外鍵 oracle 設(shè)置外鍵
網(wǎng)頁(yè)地址:http://jinyejixie.com/article16/hpcsdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣虛擬主機(jī)、用戶體驗(yàn)軟件開發(fā)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
江北区| 钟山县| 济源市| 舒兰市| 文水县| 固原市| 墨玉县| 新蔡县| 固镇县| 平定县| 屯门区| 安陆市| 平遥县| 榕江县| 含山县| 梁河县| 镇江市| 宝鸡市| 醴陵市| 交口县| 嘉兴市| 石门县| 汉阴县| 沙河市| 报价| 如皋市| 正阳县| 株洲县| 瑞丽市| 筠连县| 郁南县| 长沙县| 博罗县| 湖口县| 鄂伦春自治旗| 连城县| 临武县| 呼和浩特市| 永平县| 内乡县| 北票市|