2017-07-25 122 views
0

我已經使用PHP代碼來保存數據庫的完整性很多年了,但是現在我正在從MyISAM切換到InnoDB,並認爲使用外鍵約束可能會更好,讓數據庫承載更多的負載。但是我想在進行級聯之前與用戶確認,所以限制將被聲明爲ON DELETE RESTRICT。當我收到錯誤信息時,我會讓用戶知道存在從屬記錄和多少個,如果他們說「當然,刪除它們」,那麼讓數據庫執行級聯刪除會很好。是否可以告訴一個特定的DELETE聲明繼續並級聯?我期待DELETE命令有一個選項或者其他東西(例如僞代碼DELETE FROM table WHERE ... CASCADE TO child-table),但我什麼也沒看到。MariaDB/MySQL外鍵約束:可能在刪除時請求級聯?

例(非常標準的許多一對多):

CREATE TABLE `person` (
    `PersonID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `FullName` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '', 
    <many other fields>, 
    PRIMARY KEY (`PersonID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
CREATE TABLE `category` (
    `CategoryID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `Category` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 
    PRIMARY KEY (`CategoryID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
CREATE TABLE `percat` (
    `PersonID` mediumint(8) unsigned NOT NULL DEFAULT 0, 
    `CategoryID` mediumint(8) unsigned NOT NULL DEFAULT 0, 
    PRIMARY KEY (`PersonID`,`CategoryID`), 
    FOREIGN KEY (`PersonID`) REFERENCES `person`(`PersonID`) ON DELETE RESTRICT, 
    FOREIGN KEY (`CategoryID`) REFERENCES `category`(`CategoryID`) ON DELETE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin; 

我發現How to cascade-delete temporarily or on-demand?但是:(1)它是SQLServer的,不MySQL的(當然,技術上我使用MariaDB的10.2.4,如果所以我不知道是否有更多的選項可供我使用,(b)這樣的存儲過程代碼不會比我已經擁有的PHP代碼更簡單(當我發展中),所以我沒有看到將另一個換成另一個的意義。

+0

你是說你不知道'ON DELETE CASCADE',還是你想暫時從RESTRICT更改爲CASCADE? PS實現通過刪除限制,添加級聯,更新,刪除刪除,儘可能將級聯推入到DBMS中。 – philipxy

+0

我知道'ON DELETE CASCADE' - 我正在談論臨時更改,或者更準確地說,是一個*本地異常*。我關心的是由'ALTER TABLE'改爲級聯,這會影響整個系統,並可能導致其他併發用戶意外級聯。另外,如果在兩個'ALTER TABLE'語句之間的某個步驟中死亡,它可能不會恢復到RESTRICT。所以你的建議對我來說聽起來很危險。 – OsakaWebbie

回答

1

簡短的回答:第

較長的答案:

答案是笨笨:FKS是頭腦簡單。當你要求更多瑣碎的操作時,你需要太多的FK,並且你需要在應用程序中建立「業務邏輯」。

同上觸發器。與重打者相比,MySQL(和MariaDB)一直是「精益和平均」。 FKs作爲對功能列表的檢查存在「是的,我們也有FK」。所以,FK細節中任何深奧的東西都很可能缺失。

有時語法實現時沒有任何實際代碼 - CHECK; INDEX(x DESC)。 (後者最終在8.0中實現,但我估計用例的數量約爲千分之一)。

+0

好的,謝謝。我開始認爲這是答案,但我想要確認。我將繼續使用PHP盡我所能捕捉所有內容,並將FK添加爲安全網。我滿足於「精益和平均」 - 我希望我的數據庫速度更快。 – OsakaWebbie

+0

如果您已經知道FK違規沒有機會,請不要使用FK。檢查FK確實需要付出一些努力。 –

+0

「......如果你已經知道這是沒有機會的......」我無法分辨你是否正在喋喋不休,或者你有比我更自信的能力來編寫無錯代碼! ;-) – OsakaWebbie