新聞中心
在數(shù)據庫設計中,數(shù)據之間往往存在著關聯(lián)關系。例如,在一個圖書借閱系統(tǒng)中,一本圖書與借閱記錄之間就存在著關聯(lián)關系。當我們刪除一本圖書時,必須同時刪除與之關聯(lián)的借閱記錄,否則就會導致數(shù)據不一致。為了解決這個問題,數(shù)據庫提供了一種叫做級聯(lián)刪除(也叫級聯(lián)更新)的功能,它可以在刪除(或更新)一個記錄時,自動刪除(或更新)與之關聯(lián)的記錄,從而保證數(shù)據的完整性和一致性。

創(chuàng)新互聯(lián)建站長期為上千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為赤壁企業(yè)提供專業(yè)的網站制作、成都做網站,赤壁網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
一、什么是級聯(lián)刪除和級聯(lián)更新?
級聯(lián)刪除和級聯(lián)更新是指在刪除或更新一個記錄時,數(shù)據庫自動將與之相關的記錄刪除或更新的功能。這個功能非常實用,它可以幫助我們簡化數(shù)據庫的操作,并且保證數(shù)據的一致性。
以一個例子來說明:假設我們有一個學生-課程的關系表,存儲學生與課程之間的選課關系。其中,學生表和課程表分別為:
學生表(Student)
|字段名 |類型 |長度 |說明 |
|—- |—– |—– |—– |
|id |int |11 |學生ID |
|name |varchar |50 |學生姓名 |
|age |int |3 |學生年齡 |
課程表(Course)
|字段名 |類型 |長度 |說明 |
|—- |—– |—– |—– |
|id |int |11 |課程ID |
|name |varchar |50 |課程名稱 |
|credit |real |4,2 |學分 |
學生-課程關系表(StuCourse)
|字段名 |類型 |長度 |說明 |
|—- |—– |—– |—– |
|id |int |11 |關系ID |
|stu_id |int |11 |學生ID,外鍵 |
|course_id |int |11 |課程ID,外鍵 |
這里的“stu_id”和“course_id”字段都是外鍵,它們分別指向了學生表和課程表中的一條記錄。因此,它們之間具有關聯(lián)關系。如果我們要刪除學生表中的某個記錄,那么這個學生在“學生-課程關系表”中的所有記錄也必須被刪除,否則就會導致數(shù)據不一致。
在這種情況下,我們就可以使用級聯(lián)刪除功能。這個功能可以讓我們在刪除學生表中的一條記錄時,自動刪除“學生-課程關系表”中與之相關的記錄。具體來說,我們可以在定義外鍵的時候指定級聯(lián)規(guī)則。如果指定了級聯(lián)刪除功能,那么當刪除學生表中的一條記錄時,數(shù)據庫會自動找到這個學生在“學生-課程關系表”中的所有記錄,并將其刪除。
同樣的,級聯(lián)更新功能也可以起到相同的作用。在更新一條記錄的時候,如果相關的記錄也需要更新,那么我們就可以使用級聯(lián)更新功能來自動更新這些記錄。
二、如何設置級聯(lián)刪除和級聯(lián)更新?
在MySQL數(shù)據庫中,我們可以通過定義外鍵來設置級聯(lián)刪除和級聯(lián)更新的功能。定義外鍵的語法格式為:
“`sql
ALTER TABLE 表名 ADD CONSTRNT 外鍵名 FOREIGN KEY (列名) REFERENCES 關聯(lián)表名(關聯(lián)列名) [ON DELETE/UPDATE CASCADE]
“`
其中“ON DELETE/UPDATE CASCADE”就是用來定義級聯(lián)刪除和級聯(lián)更新的關鍵字。如果我們想要啟用級聯(lián)刪除,就可以將關鍵字設置為“CASCADE”,如果想要啟用級聯(lián)更新,就可以將關鍵字設置為“SET NULL”或“CASCADE”。
例如,在上例中,我們可以使用以下的語句來定義“學生-課程關系表”中的外鍵,并啟用級聯(lián)刪除和級聯(lián)更新功能:
“`sql
ALTER TABLE StuCourse ADD CONSTRNT fk_stu_id FOREIGN KEY(stu_id) REFERENCES Student(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE StuCourse ADD CONSTRNT fk_course_id FOREIGN KEY(course_id) REFERENCES Course(id) ON DELETE CASCADE ON UPDATE CASCADE;
“`
這樣一來,當我們刪除學生表或者課程表中的一條記錄時,這個學生或者課程在“學生-課程關系表”中的所有記錄也會被刪除或更新,從而保證了數(shù)據的一致性和完整性。
三、級聯(lián)刪除和級聯(lián)更新的注意事項
在使用級聯(lián)刪除和級聯(lián)更新功能時,我們需要注意以下幾點:
1. 數(shù)據庫必須支持外鍵和級聯(lián)刪除和級聯(lián)更新功能。
2. 推薦使用級聯(lián)刪除和級聯(lián)更新功能來保證數(shù)據的一致性和完整性。
3. 在使用級聯(lián)刪除和級聯(lián)更新功能時,需要考慮到性能問題。如果一個表中有大量的記錄,同時還有多個與之相關的表,那么啟用級聯(lián)刪除和級聯(lián)更新功能會極大地影響數(shù)據庫的性能。因此,我們需要權衡利弊來決定是否啟用這個功能。
4. 在使用級聯(lián)刪除和級聯(lián)更新功能時,需要避免死循環(huán)。如果兩個表之間存在著循環(huán)引用的關系,那么啟用級聯(lián)刪除和級聯(lián)更新功能可能會導致死循環(huán)的問題。
5. 在使用級聯(lián)刪除和級聯(lián)更新功能時,需要特別注意數(shù)據的備份和恢復問題。如果我們在數(shù)據備份和恢復的時候沒有考慮到級聯(lián)刪除和級聯(lián)更新的問題,那么就可能導致數(shù)據丟失或者不一致的問題。
綜上所述,級聯(lián)刪除和級聯(lián)更新是一種非常實用的功能,它可以幫助我們簡化數(shù)據庫的操作,并且保證數(shù)據的一致性。在使用這個功能的時候,我們需要注意到以上幾點,從而更好地保護我們的數(shù)據。
相關問題拓展閱讀:
- 刪除數(shù)據庫多余數(shù)據,但是數(shù)據庫表與表之間有關聯(lián)。請問如何刪除整條數(shù)據鏈?
- 在oracle數(shù)據庫中刪除用戶drop user username cascade; 但是現(xiàn)在報錯啊就高人
- 一個圓柱體,如果它的高增加厘米,它的表面積就增加.平方厘米,這個圓柱體的底面半徑是多少?
刪除數(shù)據庫多余數(shù)據,但是數(shù)據庫表與表之間有關聯(lián)。請問如何刪除整條數(shù)據鏈?
我知道可以用游標來解決這個問題,一個伍賀一個的TRUNCATE,但是表之間是有約束的,必須得到表的約束關系才能做刪除的動作,不然會報錯的!表之間的依賴關系如何才能得到呢?這個好像是腔李派我這個問題擾團的關鍵
因為刪除是一個影響完整性的操作,有一個辦法,delete的時候后面加個 ‘on delete cascasde’ 但是這是個級聯(lián)刪除毀毀,會把你關聯(lián)的數(shù)據鎮(zhèn)余散全部御氏刪除掉。
delete,具體視數(shù)據庫提示在寫
在oracle數(shù)據庫中刪除用戶drop user username cascade; 但是現(xiàn)在報錯啊就高人
好吧!我?guī)湍闼阉飨碌玫揭韵聝热?/p>
1. drop user出現(xiàn)問題
報出以下錯誤后退出
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist .
關于 recursive SQL 錯誤我們有必要做個簡單說明。
我們知道,當我們發(fā)出一條簡單的命令以后
Oracle數(shù)據庫要在后臺解析這條命令,并轉換為Oracle數(shù)據庫的一系列后臺操作。
這些后臺操作統(tǒng)稱為遞歸sql.
比如create table這樣一條簡單的DDL命令,Oracle數(shù)據庫在后臺,實際上要把這個命令轉換為對于obj$,tab$,col$等底層表的插入簡穗操作。Oracle所作的工作可能比我們有時候想的要復雜的多。
2.跟蹤問題
我們知道Oracle提供sql_trace的功能
可以用于跟蹤Oracle數(shù)據庫的后臺遞歸操作。
通過跟蹤文件,我們可以找到問題的所在
以下是格式化(tkprof)后的輸出:
The following statement encountered a error during parse:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = ‘WAPCOMM’
Error encountered: ORA-00942
Oracle把錯誤信息首先呈現(xiàn)出來,我們看到ORA-00942錯誤是由于
SDO_GEOM_METADATA_TABLE表/視圖不存在所致,問題由此可以定位。
對于這一類的錯誤,定位問題以后解決的方法就要依據具體問題原攔則卜因而定了。
盯絕3.問題定位
對于本案例,通過Metalink獲得以下解釋:
Problem Description
The Oracle Spatial Option has been installed and you are encountering
the following errors while trying to drop a user, who has no spatial tables,
connected as SYSTEM:
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 7
A 942 error trace shows the failing SQL statement as:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = ”
Solution Description
(1)
Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to
MDSYS.SDO_GEOM_METADATA_TABLE.
對于本例,為MDSYS.SDO_GEOM_METADATA_TABLE創(chuàng)建一個同義詞即可解決,是相對簡單的情況。
(2)
Now the user can be dropped connected as SYSTEM.
Related Documents
ORA-604 and ORA-942 Reported During DROP USER CASCA
4.實際處理
MDSYS.SDO_GEOM_METADATA_TABLE為Spatial對象,如果未使用Spatial選項,可以刪除
SQL> connect / as sysdbaConnected.
SQL> select * from dba_sdo_geom_metadata order by owner;
select * from dba_sdo_geom_metadata order by owner
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-04063: view “MDSYS.DBA_SDO_GEOM_METADATA” has errors
SQL> select object_name from dba_objects where object_name like ‘%SDO%’;
OBJECT_NAME
ALL_SDO_GEOM_METADATA
ALL_SDO_INDEX_INFO
ALL_SDO_INDEX_METADATA
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
DBA_SDO_INDEX_METADATA
….
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
…
SDO_WITHIN_DISTANCE
USER_SDO_GEOM_METADATA
USER_SDO_INDEX_INFO
USER_SDO_INDEX_METADATA
88 rows selected.
SQL> drop user MDSYS cascade;
User dropped.
SQL> select owner,type_name from dba_types where type_name like ‘SDO%’;
no rows selected
SQL>
SQL> alter session set sql_trace=true;
Session altered.
SQL> drop user wapcomm;
User dropped.
SQL> alter session set sql_trace=false;
Session altered.
SQL> exit
Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 – 64bit Production
With the Partitioning option
erver Release 8.1.7.4.0 – 64bit Production
這時用戶得以順利drop
5.一點總結
使用sql_trace可以跟蹤數(shù)據庫的很多后臺操作有利于我們發(fā)現(xiàn)問題的所在,很多時候,我們想要研究Oracle的內部活動或后臺操作,也可以通過sql_trace跟蹤,sql_trace/10046 是Oracle提供的最為有效的診斷工具之一。
案例四:表更新時發(fā)生遞歸SQL2級失敗錯誤
問題描述:表更新的時候失敗了,并且生成了一條ORA錯誤信息。這個錯誤發(fā)生在遞歸SQL 2級。
解決方案:不幸的是,這個錯誤并不能告訴你Oracle數(shù)據庫在錯誤發(fā)生的時候正要做什么。當你執(zhí)行一條SQL語句的時候,Oracle數(shù)據庫會為你在幕后做很多事情。例如,考慮下面的SQL語句:
UPDATE emp SET sal = sal*1.05 WHERE empno=1001;
這條SQL語句給號碼為1001的雇員漲5%的工資。當你執(zhí)行這條語句的時候,Oracle查詢數(shù)據目錄來確定是否有這個表或者你是否使用了同義字。一旦它找到了數(shù)據庫對象,Oracle查詢數(shù)據字典來判斷你是否擁有訪問這個對象的權限。那么,Oracle到底是如何與數(shù)據字典進行交互的呢?它執(zhí)行一條自己的SQL 語句。這些Oracle為你執(zhí)行的SQL語句被稱為“遞歸”SQL語句。你最初的SQL 語句是0級。Oracle為你執(zhí)行的遞歸SQL語句是1級。有時候,一條遞歸SQL語句又會引起自己的遞歸SQL語句,就是2級。
在你的案例中,有一個2級的遞歸SQL語句正在執(zhí)行,并且產生了問題。為了解決問題,你需要找出執(zhí)行的是什么遞歸SQL語句引起的錯誤。要做到這一點,你必須啟動會話中的追蹤。
首先,執(zhí)行下面的SQL 語句:
ALTER SESSION SET sql_trace=TRUE;
然后,執(zhí)行你的更新語句。你會看到ORA-604 錯誤。接下來,執(zhí)行下面的語句:
ALTER SESSION SET sql_trace=FALSE;
現(xiàn)在到你為數(shù)據庫定義的USER_DUMP_DEST 起始參數(shù)上的路徑去。那里應該有一個時間戳為當前時間的文件。那個就是你生成的追蹤文件。你可以打開文件并檢查遞歸SQL語句,其中包括引起錯誤的一條。
來源
可以通過10046事件去追蹤這條語句的執(zhí)行過程,估計是某張系統(tǒng)表出了問題
重新啟動數(shù)據庫試試。不行就開啟trace功能,再查看trace文件看看問題出在哪里
一個圓柱體,如果它的高增加厘米,它的表面積就增加.平方厘米,這個圓柱體的底面半徑是多少?
50.24÷2÷3.14÷2
=25.12÷3.14÷2
=4(厘米)
底面周長是和顫胡:50.24÷2=25.12厘米
底喚攔面半徑是:洞塌25.12÷3.14÷2=4厘米
高是:4×2+2=10厘米
這個圓柱的體積是:3.14×4×4×10=502.4立方厘米
25.48
4cm
數(shù)據庫 cascads的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于數(shù)據庫 cascads,數(shù)據庫級聯(lián)刪除與更新操作詳解,刪除數(shù)據庫多余數(shù)據,但是數(shù)據庫表與表之間有關聯(lián)。請問如何刪除整條數(shù)據鏈?,在oracle數(shù)據庫中刪除用戶drop user username cascade; 但是現(xiàn)在報錯啊就高人,一個圓柱體,如果它的高增加厘米,它的表面積就增加.平方厘米,這個圓柱體的底面半徑是多少?的信息別忘了在本站進行查找喔。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網站系統(tǒng)開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
新聞名稱:數(shù)據庫級聯(lián)刪除與更新操作詳解(數(shù)據庫cascads)
文章源于:http://m.fisionsoft.com.cn/article/cojpohe.html


咨詢
建站咨詢
