oracle不支持級聯(lián)更新,
成都創(chuàng)新互聯(lián)-專業(yè)網站定制、快速模板網站建設、高性價比安鄉(xiāng)網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式安鄉(xiāng)網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋安鄉(xiāng)地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
可以用觸發(fā)器實現(xiàn):
Create Or Replace Trigger g_Cardapply_Tr
After Update Of g_State On g_Cardapply
For Each Row
Begin
Update g_Cardapplydetail a
Set a.g_State = :New.g_State
Where a.g_State = :Old.g_State;
End;
用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、外鍵有無索引,對于子表更新外鍵未提交,主表更新相對應的主鍵無影響,更新主鍵的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)到子表,子表將進行全表掃描。
總結:在需要更新主鍵的情況下,最好是創(chuàng)建子表的外鍵索引。
等待事物結束才是正常
進程1執(zhí)行了更新語句,但一直沒有提交,進程2后來也執(zhí)行了更新語句,并先提交,最后進程1提交。
這個例子在oracle中應該是不能成功的,他破壞了數(shù)據(jù)的讀寫一致性。在update 語句后緊跟commit 不就能實現(xiàn)你的需求么
建表及數(shù)據(jù)
create?table?test
(fid?int,
parentid?int,
fpath?varchar2(100));
insert?into?test?values?(1,null,null);
insert?into?test?values?(2,1,null);
insert?into?test?values?(3,1,null);
insert?into?test?values?(4,2,null);
執(zhí)行更新語句
update?test?a?set?a.fpath=
(select?b.fpath?from
(select?fid,parentid,
substr(sys_connect_by_path(fid,'/'),2)?fpath
from???test
start??with?fid=1
connect?by?prior?fid=parentid)?b
where?a.fid=b.fid);
效果截圖
外鍵只能是參照表的主鍵,所以應該參照userid,要參照uname只能用觸發(fā)器。
create table users (userid primary key,uname unique)
go
create table board (bid primary key,bhost, foreign key(bhost) references users(userid) on delete CASCADE on update CASCADE)
Oracle中不需要用join連接更新數(shù)據(jù),連接表更新方法如下:
有以下兩張表:
根據(jù)test2表中的id和test1表中的id關聯(lián),修改test1表中name字段,語句如下:
update?test1?a?set?a.name=(select?b.name?from?test2?b?where?a.id=b.id)?where?a.id?in?(select?id?from?test2);
更新后,test1表中結果: