作者表 A (ID,NAME,AGE,SEX)其中ID為主鍵,文章表B(ID,AID,ARTICLE)其中ID為主鍵,AID為外鍵。如果你希望更新表A中某個作者的ID,并同時更新文章表B中對應(yīng)的數(shù)據(jù),那么寫一個觸發(fā)器:
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了勐海免費建站歡迎大家使用!
create or replace trigger "A"
after update
of ID
on A_author
for each row
begin
if (:new.ID:old.ID ) then
update B_article set AID = :new.ID where AID = :old.ID;
end if;
end A;
工具/材料
SQL Developer
01
首先打開SQL Developer軟件,找一個沒有主鍵約束的表,如下圖所示
02
然后我們新建一個查詢,在界面中輸入如下的約束修改語句,如下圖所示,主要通過add constranint來添加約束
03
編寫完約束添加語句以后,點擊工具欄中的執(zhí)行按鈕,如下圖所示,如果輸出欄顯示已變更則證明主鍵約束創(chuàng)建成果
04
然后我們進(jìn)入STUDENT表的約束添加頁中可以看到,我們加的主鍵約束已經(jīng)添加進(jìn)去了,如下圖所示
05
另外,創(chuàng)建表的時候可以直接添加主鍵約束,如下圖所示,直接在表創(chuàng)建語句中添加constraint即可
06
表創(chuàng)建完以后,記得在左側(cè)刷新數(shù)據(jù)庫信息,如下圖所示,因為你創(chuàng)建的信息不刷新的話不會更新
07
最后打開你所創(chuàng)建的表,看到你添加的主鍵約束已經(jīng)加入進(jìn)來了,這種方式的效果alter的方式是一樣的
用scott用戶打開兩個窗口
1、外鍵無索引時,子表更新外鍵未提交,主表更新非子表引用的主鍵時被阻塞
會話1:
create table t1 (x int primary key);
insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);
commit;
create table t2(y int references t1);
insert into t2 values(1);
commit;
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=3; //會話被阻塞
2、外鍵有索引時,子表更新外鍵未提交,主表更新非子表引用的主鍵時不會被阻塞
會話1:
create index t2_index on t2(y) ; //創(chuàng)建外鍵索引
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=3;
已更新 1 行;//可以正常更新
3、外鍵有無索引,對于子表更新外鍵未提交,主表更新相對應(yīng)的主鍵無影響,更新主鍵的session都會被阻塞
會話1:
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=1; //更新子表已引用的
會話被阻塞。
會話1:
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=2 ; //更新子表將要引用的
會話被阻塞。――很好理解,主表要判斷是否違反約束
二、更新子表非外鍵列未提交
1、外鍵無索引,更新主表已被外鍵引用的主鍵時,更新主鍵的session被阻塞
會話1:
create table t1 (x int primary key,x1 int);
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);
commit ;
create table t2(y int references t1,y1 int);
insert into t2 values(1,1);
commit ;
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=1; //更新外鍵引用的主鍵
會話被阻塞。
2、外鍵有索引,更新主表已被外鍵引用的主鍵時,更新主鍵的session不會被阻塞而報約束錯誤
會話1:
create index t2_index on t2(y);
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=1
*
ERROR 位于第 1 行:
ORA-02292: 違反完整約束條件 (SCOTT.SYS_C001607) - 已找到子記錄日志
3、外鍵無索引,更新主表未被外鍵引用的主鍵時,更新主鍵的session被阻塞
會話1:
drop index t2_index;
update t2 set y1=2 where y1=1
會話2:
update t1 set x=4 where x=2;
會話被阻塞。
4、外鍵有索引,更新主表未被外鍵引用的主鍵時,更新主鍵的session不會被阻塞
會話1:
create index t2_index on t2(y);
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=2;
已更新 1 行。
另外在一個主表有on delete cascade,子表沒有外鍵索引時,對主表操作會級聯(lián)到子表,子表將進(jìn)行全表掃描。
總結(jié):在需要更新主鍵的情況下,最好是創(chuàng)建子表的外鍵索引。
業(yè)務(wù)不忙時可開啟并行,另外也不知道具體怎么更新,注意綁定變量什么的
可試試有索引或主鍵先就先讓其失效,更新完再維護(hù)下
1、首先應(yīng)該刪除已有的主鍵約束\x0d\x0a ①若已知道該主鍵命名\x0d\x0a\x0d\x0a alter table 表名 drop constraint 主鍵名;\x0d\x0a\x0d\x0a ②若不知道朱建命名\x0d\x0a\x0d\x0a SELECT * from user_cons_columns c where c.table_name = '表名';\x0d\x0a\x0d\x0a 找到主鍵字段column對應(yīng)的主鍵名,再執(zhí)行①\x0d\x0a\x0d\x0a2、增加新的主鍵約束\x0d\x0a alter table 表名 add constraint 主鍵名 primary key(字段名);
Create Or Replace Procedure p_Update_Add(Pn_Id ? ? In Number, --傳入的id
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Ln_Code ? Number, --返回碼
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Lr_Reinfo Number) Is
Ln_Flags Number;
Begin
Select Count(1) Into Ln_Flags From t_Test Where Id = Pn_Id; --t_test為測試表
If Ln_Flags 0 Then
--有一條或多條記錄存在,表示主鍵已經(jīng)存在,進(jìn)行更新操作
Update t_Test Set Xxx = Xxx;
Lr_Code ? := 1;
Lr_Reinfo := '進(jìn)行更新';
Elsif Ln_Flags = 0 Then
--沒有記錄,進(jìn)行添加操作
Insert Into t_Test Values (Xx, Xxx, Xxx, Xxx);
Lr_Code ? := 2;
Lr_Reinfo := '進(jìn)行新增';
Else
Lr_Code ? := -1;
Lr_Reinfo := '操作失敗';
End If;
Exception
When Others Then
Dbms_Output.Put_Line('出現(xiàn)異常');
Rollback;
End;
文章名稱:oracle怎么更新主鍵,oracle如何修改主鍵
網(wǎng)頁鏈接:http://muchs.cn/article32/hssjsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、靜態(tài)網(wǎng)站、做網(wǎng)站、軟件開發(fā)、虛擬主機、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)