Mysql

在 FOREIGN KEY 約束中使用 RESTRICT 或 No ACTION

  • July 7, 2018

抱歉,如果這個問題很幼稚,但我無法理解 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";
  1. 如果DELETE FROM column1 WHERE first_id='XX'column2(子列)中對應的行會被刪除
  2. 如果DELETE FROM column2 WHERE first_id='XX'不會從 column1(父列)中刪除任何內容

正確的?那麼,什麼以及如何RESTRICTNO ACTION可以改變這種情況?

在 MySQL 中,RESTRICTNO 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 CASCADEorON UPDATE CASCADE子句。該手冊明確指出,如果不這樣做,您就是在暗示RESTRICT

指定 RESTRICT(或 NO ACTION)與省略 ON DELETE 或 ON UPDATE 子句相同。

所以,現在當像這樣定義表時,DELETE FROM column1 WHERE first_id='3'如果其中有任何值為 3的行column2, a 將失敗。first_id

如果您有一個子表需要在刪除值之前對其進行一些處理,則可以使用它來確保在適當地清理子表之前不能刪除父表。它仍然提供對子表中孤立行的保護(孤立行是存在於子表中的行,在父表中沒有匹配的引用)。

引用自:https://dba.stackexchange.com/questions/13571