簡體   English   中英

刪除行時如何刪除它的外鍵?

[英]How to delete a row's foreign key when it is deleted?

給出下表:

create table permissions(id identity);
create table companies(id identity, 
    permission_id bigint not null, 
    foreign key(permission_id) references permissions(id) on delete cascade);
create table departments(id identity, 
    company_id bigint not null, 
    permission_id bigint not null, 
    foreign key(company_id) references companies(id), 
    foreign key(permission_id) references permissions(id) on delete cascade);

刪除部門后,我希望以下語句自動執行:

  • departments行已刪除
  • 與部門行關聯的permissions行被刪除
  • 與部門行關聯的companies行被刪除
  • 與公司關聯的permissions行(上一個點)已刪除

問題:

  1. 如果我在所有外鍵上使用READ_COMMITTED事務隔離和ON CASCADE DELETE ,則將行作為單個原子語句刪除嗎? 還是將它們作為易受READ_COMMITTED異常影響的單獨的delete語句執行?
  2. 當公司/部門被刪除時(如果可能的話),我如何指示數據庫刪除公司/部門的權限?
  3. SQL標准是否對此問題有任何說明? 還是不同數據庫之間的行為有所不同?

說明:

  1. 公司/部門需要引用權限表,而不是相反。 這是因為permissions構成了關閉表 (例如,用戶具有對公司的許可,而公司具有對部門的許可,因此用戶具有對部門的許可)。 因為層次關系跨越不同的類型(即用戶,公司,部門),所以權限表不能指向特定的類型。 因此,公司/部門必須引用許可,而不是相反。
  2. 假設我要刪除部門,僅刪除部門的權限並讓CASCADE負責其余工作是不夠的,因為它將刪除部門的權限,部門和公司,但忽略了刪除公司的權限。
  3. 在刪除公司/部門之后,我無法使用觸發器來刪除權限,因為H2在與主語句不同的數據庫連接中運行觸發器,並且兩者在同一公司/部門行上請求寫鎖定。 第一個連接鎖定了我要刪除的 companies行。 第二個連接(觸發)嘗試刪除與公司關聯的 permissions行,但是 ON CASCADE DELETE它也需要鎖定公司。 這是由於H2的限制所致,因此需要解決方法。 請參閱https://groups.google.com/d/msg/h2-database/B3xG488RBhI/DOsIMVmPBnAJ

它在大多數數據庫中都是原子性的,除了帶有MyISAM的mysql以及MS Access之外,通常您可以使用觸發器來完成您想做的事情,但這很奇怪,因為通常與我們想要的相反,我的意思是當刪除一個權限后,具有該權限的部門也將被刪除

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM