我已經使用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代碼更簡單(當我發展中),所以我沒有看到將另一個換成另一個的意義。
你是說你不知道'ON DELETE CASCADE',還是你想暫時從RESTRICT更改爲CASCADE? PS實現通過刪除限制,添加級聯,更新,刪除刪除,儘可能將級聯推入到DBMS中。 – philipxy
我知道'ON DELETE CASCADE' - 我正在談論臨時更改,或者更準確地說,是一個*本地異常*。我關心的是由'ALTER TABLE'改爲級聯,這會影響整個系統,並可能導致其他併發用戶意外級聯。另外,如果在兩個'ALTER TABLE'語句之間的某個步驟中死亡,它可能不會恢復到RESTRICT。所以你的建議對我來說聽起來很危險。 – OsakaWebbie