Mysql
在 FOREIGN KEY 約束中使用 RESTRICT 或 No ACTION
抱歉,如果這個問題很幼稚,但我無法理解 RESTRICT 或 No ACTION 的可能用法。考慮一個簡單的數據庫
CREATE TABLE column1 ( first_id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (first_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci"; CREATE TABLE column2 ( second_id int(11) NOT NULL AUTO_INCREMENT, first_id int(11) REFERENCES column1(first_id) ON DELETE CASCADE, PRIMARY KEY (second_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci";
- 如果
DELETE FROM column1 WHERE first_id='XX'
column2(子列)中對應的行會被刪除- 如果
DELETE FROM column2 WHERE first_id='XX'
不會從 column1(父列)中刪除任何內容正確的?那麼,什麼以及如何
RESTRICT
或NO ACTION
可以改變這種情況?
在 MySQL 中,
RESTRICT
和NO ACTION
是同義詞:在 MySQL 中,立即檢查外鍵約束,因此 NO ACTION 與 RESTRICT 相同。$$ src $$
DELETE FROM column1 WHERE first_id='XX'
現在,您要問的是,如果表是這樣定義的,這將如何影響 a :CREATE TABLE `column2` ( `second_id` int(11) NOT NULL AUTO_INCREMENT, `first_id` int(11) NOT NULL, PRIMARY KEY (`second_id`), KEY `fk_first_id` (`first_id`), CONSTRAINT `fk_first_id` FOREIGN KEY (`first_id`) REFERENCES `column1` (`first_id`) ) ENGINE=InnoDB;
注意沒有
ON DELETE CASCADE
orON UPDATE CASCADE
子句。該手冊明確指出,如果不這樣做,您就是在暗示RESTRICT
:指定 RESTRICT(或 NO ACTION)與省略 ON DELETE 或 ON UPDATE 子句相同。
所以,現在當像這樣定義表時,
DELETE FROM column1 WHERE first_id='3'
如果其中有任何值為 3的行column2
, a 將失敗。first_id
如果您有一個子表需要在刪除值之前對其進行一些處理,則可以使用它來確保在適當地清理子表之前不能刪除父表。它仍然提供對子表中孤立行的保護(孤立行是存在於子表中的行,在父表中沒有匹配的引用)。